Вся информация о Conditional (Trace) хороша, но я предполагаю, что ваш реальный вопрос заключается в том, что вы хотите оставить вызовы Trace в своем рабочем коде, но (обычно) отключить их во время выполнения, если у вас не возникнет проблема.
Если вы используете TraceSource (что, я полагаю, следует делать, а не вызывать Trace напрямую, потому что это дает вам более детальный контроль над трассировкой на уровне компонентов во время выполнения), вы можете сделать что-то вроде этого:
if (Component1TraceSource.ShouldTrace(TraceEventType.Verbose))
OutputExpensiveTraceInformation()
Это предполагает, что вы можете изолировать параметры трассировки в другой функции (т. Е. Они в основном зависят от членов текущего класса, а не от дорогостоящих операций над параметрами функции, в которой находится этот код).
Преимущество этого подхода состоит в том, что JITer компилируется по функциям в зависимости от необходимости, если «if» оценивается как false, функция не только не будет вызвана - она даже не будет JITed. Недостатком является то, что (а) вы разделили знания об уровне трассировки между этим вызовом и функцией OutputExaciousTraceInformation (поэтому, если вы, например, измените TraceEventType на TraceEventType.Information, например, он не будет работать, поскольку даже вызывайте его, если в этом примере не включен TraceSource для трассировки подробного уровня) и (б) это больше кода для записи.
В этом случае может показаться, что C-подобный препроцессор поможет (поскольку он может убедиться, например, в том, что параметр ShouldTrace и возможный вызов TraceEvent одинаковы), но я понимаю, почему C # не включает это.
Эндрю предлагает выделить дорогостоящие операции в методах .ToString объектов, передаваемых в TraceEvent, также хорошо; в этом случае вы можете, например, разработать объект, который просто используется для трассировки, в который вы передаете объекты, для которых вы хотите построить дорогостоящее строковое представление, и изолировать этот код в методе ToString объекта трассировки, а не делать это в список параметров для вызова TraceEvent (что приведет к его выполнению, даже если TraceLevel не включен во время выполнения).
Надеюсь, это поможет.