Registro / rastreamento condicional em C #

Quero adicionar log ou rastreio ao meu aplicativo C #, mas não quero que a sobrecarga de formatar a string ou calcular valores seja registrada se o nível de verbosidade do log estiver definido tão baixo que a mensagem não será registrad

No C ++, você pode usar o pré-processador para definir macros que impedirão que o código seja executado da seguinte maneira:

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

Usado assim:

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

Como você faz isso em c #?

Li os documentos da Microsoft que explicam os recursos de rastreamento e depuraçãoAqu, e afirmam que o uso de #undef DEBUG e #undef TRACE remove todo o código de rastreamento e depuração do executável produzido, mas ele remove realmente toda a chamada? Ou seja, se eu escrever

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

não chamará minha função cara se eu definir TRACE? Ou faz a ligação,entã decide que não vai rastrear nada?

De qualquer forma, mesmo que ele seja removido, isso é inferior à macro C ++ porque não posso fazer com que essa chamada feia seja parecida com a minha chamada simples VLOG () em C ++ e ainda evite avaliar parâmetros, posso? Também não posso evitar a sobrecarga definindo a verbosidade mais baixa no tempo de execução, como eu posso em C ++, cert

questionAnswers(9)

yourAnswerToTheQuestion