Desidero aggiungere la registrazione o la traccia alla mia applicazione C# ma non voglio che il sovraccarico di formattazione della stringa o dei valori di calcolo vengano registrati se il livello di dettaglio del registro è impostato in modo tale che il messaggio non essere registratoC# logging/tracing condizionale
In C++, è possibile utilizzare il preprocessore per definire le macro che impediscono il codice venga eseguito affatto come questo:
#define VLOG(level,expr) if (level >= g_log.verbosity) { g_log.output << expr; }
usati in questo modo:
VLOG(5,"Expensive function call returns " << ExpensiveFunctionCall());
Come si fa a farlo in C#?
Ho letto i documenti Microsoft che spiegano le strutture di traccia e debug here e affermano che l'utilizzo di #undef DEBUG e #undef TRACE rimuove tutto il codice di traccia e debug dall'eseguibile prodotto, ma rimuove davvero l'intera chiamata ? Significato, se scrivo
System.Diagnostics.Trace.WriteLineIf(g_log.verbosity>=5,ExpensiveFunctionCall());
non chiamerà la mia funzione costosa se non riesco a trovare TRACE? O effettua la chiamata, quindi decide che non verrà tracciato nulla?
In ogni caso, anche se lo rimuove, questo è inferiore alla macro C++ perché non riesco a far sembrare quella grossa chiamata simile alla mia semplice chiamata VLOG() in C++ e comunque a evitare di valutare i parametri, posso? Né posso evitare il sovraccarico definendo la verbosità più bassa in fase di esecuzione come posso fare in C++, giusto?
Il prefisso lungo non è la parte brutta ma il fatto che devo esporre g_log.verbosity e anche il nome della funzione WriteLineIf dappertutto. Voglio avere la mia funzione come VLOG (5, ...). –