为什么 Debug.WriteLine 没有 DEBUG 常量就不能工作?

Why doesn't Debug.WriteLine work without the DEBUG constant?

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

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

我能想到这可能发生的几种可能方式:

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

那么它是如何工作的?

Debug.WriteLine(..) 如果在编译代码时未设置 DEBUG 常量,编译器会删除调用。

在您的代码中模拟这一点的一种方法是使用 #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 class 对 WriteLine(..).[=17= 的作用]

确切的细节可以在 ConditionalAttribute 文档的 MSDN 上的以下 link 找到:https://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute(v=vs.110).aspx

例如查看 Conditional attribute... It causes the method call to be ignored at JIT-time if the specified symbol is not defined. Most System.Diagnostic.Debug methods are defined using this attribute and the value "DEBUG" (see reference source),因此如果 DEBUG 符号未在 JIT 时间定义,则不会发生调用。