我遇到了一个问题,有人显然在我正在处理的C#.NET项目中禁用了DEBUG
和TRACE
常量,因此我对Debug.WriteLine
的调用无效。 (输出中没有显示调试输出。)重新启用它们as described here后,我开始看到输出。
知道如何修复它很有帮助,但我的问题是为什么?据我所知,DEBUG
是编译时常量,并且在构建项目时已经编译了Debug
类。那么我对Debug.WriteLine
的调用如何被跳过;不应该像我所有的其他代码一样编译它们吗?
我可以想到一些可能的方法:
Debug
有一些疯狂的代码,用于检查在编译时设置某种标志的调用程序集MS的documentation表示这是预期的行为,但我无法找到有关其实际工作方式的任何文档。当然,这也可能是我从未想过的事情。
那它是如何运作的?
答案 0 :(得分:1)
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符号,则不会发生调用。