为什么Debug.WriteLine不能在没有DEBUG常量的情况下工作?

时间:2016-06-06 23:47:38

标签: .net debugging compile-time-constant

我遇到了一个问题,有人显然在我正在处理的C#.NET项目中禁用了DEBUGTRACE常量,因此我对Debug.WriteLine的调用无效。 (输出中没有显示调试输出。)重新启用它们as described here后,我开始看到输出。

知道如何修复它很有帮助,但我的问题是为什么?据我所知,DEBUG编译时常量,并且在构建项目时已经编译了Debug类。那么我对Debug.WriteLine的调用如何被跳过;不应该像我所有的其他代码一样编译它们吗?

我可以想到一些可能的方法:

  • MS在编译器中实现了一些特殊的“功能”,以便在没有常量
  • 的情况下删除这些调用
  • Visual Studio设置调试器,使其在运行时根据调试输出的项目设置进行监听或不监听
  • Debug有一些疯狂的代码,用于检查在编译时设置某种标志的调用程序集

MS的documentation表示这是预期的行为,但我无法找到有关其实际工作方式的任何文档。当然,这也可能是我从未想过的事情。

那它是如何运作的?

2 个答案:

答案 0 :(得分:1)

如果在编译代码时未设置DEBUG常量,编译器将删除

Debug.WriteLine(..)个调用。

在代码中模拟此方法的一种方法是使用#if DEBUG,例如:

#if DEBUG 
    // This portion of the code will only exist in code compiled with the DEBUG constant set.
#end if

另一种方法是将ConditionalAttribute [Conditional("DEBUG")]添加到方法的顶部,这是Debug类为WriteLine(..)所做的。

详细信息可以在ConditionalAttribute文档中的MSDN上的以下链接中找到:https://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute(v=vs.110).aspx

答案 1 :(得分:1)

查看Conditional attribute ...如果未定义指定的符号,则会导致在JIT时忽略方法调用。大多数System.Diagnostic.Debug方法是使用此属性和值“DEBUG”定义的(例如,请参见reference source),因此如果未在JIT时定义DEBUG符号,则不会发生调用。