C#中的Debug与Trace有什么区别?

10

据我所知,像Debug.WriteLine()这样的语句在Release构建中不会留在代码中。另一方面,Trace.WriteLine()在Release构建中将留在代码中。

是什么控制了这种行为?当定义了DEBUG时,C#编译器是否忽略了System.Diagnostics.Debug类中的所有内容?

我只是想了解C#的内部工作原理,很好奇。


1
提示:自己发现这类问题的一种方法是查看 Red Gate 的 .Net Reflector 中的这些方法。我想你也可以下载 Framework 源代码。请注意,.Net Reflector 很快就不会再免费了。它是一个非常有用的工具,我建议现在就下载它。 - Brian
2个回答

6
这些方法使用ConditionalAttribute来指定它们应该何时被包含。
DEBUG被指定为一个#define,通过命令行或系统环境(在shell中设置set DEBUG = 1),标记有[Conditional("DEBUG")]的方法将被编译器包括。当没有包括DEBUG时,这些方法和任何对它们的调用都将被省略。您可以自己使用这个机制在某些情况下包含方法,它也用于控制Trace调用,如Trace.WriteLine(这使用了TRACE定义)。

5
这是由于ConditionalAttribute引起的;只有在定义了该符号时,编译器才会忽略标记为条件的方法的调用。
你可以拥有自己的:
[Conditional("BLUE")]
void Bar() {...}

只有在定义了BLUE时才会调用。

请注意,为使“确定赋值”工作,存在一些限制:

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

(出于类似原因,对于部分类似的原因,partial方法也适用相同的限制)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接