C # registro / rastreo condicional

Deseo agregar el registro o el rastreo a mi aplicación C # pero no quiero que se registre la sobrecarga de formatear la cadena o calcular los valores si el nivel de verbosidad del registro se establece tan bajo que el mensaje no se registrará.

En C ++, puede usar el preprocesador para definir macros que evitarán que el código se ejecute de esta manera:

#define VLOG(level,expr) if (level >= g_log.verbosity) { g_log.output << expr; }

Utilizado así:

VLOG(5,"Expensive function call returns " << ExpensiveFunctionCall());

¿Cómo se hace eso en C #?

He leído los documentos de Microsoft que explican las funciones de seguimiento y depuraciónaqu, y afirman que el uso de #undef DEBUG y #undef TRACE elimina todo el código de rastreo y depuración del ejecutable producido, pero ¿realmente elimina toda la llamada? Es decir, si escribo

System.Diagnostics.Trace.WriteLineIf(g_log.verbosity>=5,ExpensiveFunctionCall());

no llamará a mi función costosa si no defino TRACE? O hace la llamada,lueg ¿Decidir que no rastreará nada?

e todos modos, incluso si lo elimina, esto es inferior a la macro de C ++ porque no puedo hacer que esa gran llamada fea se vea como mi simple llamada VLOG () en C ++ y aún así evito evaluar los parámetros, ¿puedo? Tampoco puedo evitar la sobrecarga definiendo la verbosidad más baja en tiempo de ejecución como puedo en C ++, ¿verdad?

Respuestas a la pregunta(9)

Su respuesta a la pregunta