为什么 Debug.WriteLine 没有 DEBUG 常量就不能工作?
Why doesn't Debug.WriteLine work without the DEBUG constant?
我 运行 遇到一个问题,显然有人在我正在处理的 C# .NET 项目上禁用了 DEBUG
和 TRACE
常量,所以我调用 Debug.WriteLine
没有效果。 (输出中没有显示调试输出。)重新启用它们后 as described here,我开始看到我的输出。
知道如何修复它很有帮助,但我的问题是为什么?据我了解,DEBUG
是一个 编译时间常数 ,并且 Debug
class 在我构建项目时已经编译。那么我对 Debug.WriteLine
的调用是如何被跳过的?它们不应该像我所有其他代码一样编译吗?
我能想到这可能发生的几种可能方式:
- MS 在编译器中实施了一些特殊的 "feature" 以删除这些没有常量的调用
- Visual Studio 设置调试器,使其在运行时根据调试输出的项目设置侦听或不侦听
Debug
有一些疯狂的代码检查调用程序集是否在编译时设置了某种标志
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 时间定义,则不会发生调用。
我 运行 遇到一个问题,显然有人在我正在处理的 C# .NET 项目上禁用了 DEBUG
和 TRACE
常量,所以我调用 Debug.WriteLine
没有效果。 (输出中没有显示调试输出。)重新启用它们后 as described here,我开始看到我的输出。
知道如何修复它很有帮助,但我的问题是为什么?据我了解,DEBUG
是一个 编译时间常数 ,并且 Debug
class 在我构建项目时已经编译。那么我对 Debug.WriteLine
的调用是如何被跳过的?它们不应该像我所有其他代码一样编译吗?
我能想到这可能发生的几种可能方式:
- MS 在编译器中实施了一些特殊的 "feature" 以删除这些没有常量的调用
- Visual Studio 设置调试器,使其在运行时根据调试输出的项目设置侦听或不侦听
Debug
有一些疯狂的代码检查调用程序集是否在编译时设置了某种标志
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 时间定义,则不会发生调用。