C#中的调试与跟踪

时间:2011-02-17 15:19:30

标签: c# debugging

据我所知,像Debug.WriteLine()这样的语句不会留在Release版本的代码中。另一方面,Trace.WriteLine()将保留在Release版本的代码中。 是什么控制了这种行为?在定义System.Diagnostics.Debug时,C#编译器是否忽略DEBUG类中的所有内容?

我只是想了解C#的内部并且只是好奇。

2 个答案:

答案 0 :(得分:6)

这些方法使用ConditionalAttribute指定何时应包括它们。

DEBUG指定为#define,通过the command line或系统环境(shell中为set DEBUG = 1)时,标有[Conditional("DEBUG")]的方法将包含在编译器中。如果未包含DEBUG,则将省略这些方法和对它们的任何调用。您可以自己使用此机制在某些情况下包含方法,它还可用于控制Trace调用,例如Trace.WriteLine(这使用TRACE定义)。

答案 1 :(得分:5)

这是由于ConditionalAttribute;除非定义了符号,否则编译器会忽略对标记为条件的方法的调用。

你可以拥有自己的:

[Conditional("BLUE")]
void Bar() {...}

仅在定义BLUE时调用。

请注意,要使“明确分配”工作有一些限制:

  • 没有返回值
  • 没有输出参数

(出于类似原因,同样的限制适用于partial方法)