2016-06-06 72 views
-2

我遇到了一个问题,那里有人显然禁用了我正在处理的C#.NET项目中的DEBUGTRACE常量,所以我对Debug.WriteLine的调用没有任何效果。 (输出中没有显示调试输出。)在重新启用它们as described here后,我开始看到我的输出。为什么Debug.WriteLine在没有DEBUG常量的情况下工作?

知道如何解决它是有帮助的,但我的问题是为什么?据我所知,DEBUG是一个编译时间常数,并且Debug类已编译,当我建立我的项目。那么我怎样才能跳过Debug.WriteLine;不应该像我所有的其他代码一样编译它们吗?

我能想到的几个可能的方式,这可能会发生:

  • MS实现了一些特殊的“功能”,在编译器不恒定
  • Visual Studio来删除这些调用设置调试器,使得它或不听基于此项目设置为调试输出,当它运行
  • Debug有一些疯狂的代码,检查调用程序集的某种标志的设置在编译时

MS的documentation表明这是预期的行为,但我一直无法追查任何关于它是如何工作的文档。当然,这也可能是我从未想过的事情。

那么它是如何工作的?

回答

1

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

+0

根据要求更新 – nitzmahone

1

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类做什么WriteLine(..)

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

+0

我只是想让你知道我非常感谢你的回答。我对是否要求你更新你的新闻或者马特是否需要更新他进行了一些辩论,但是我最终选择了他,因为它已经达到了正确的程度,并且提前发布了一些信息。但是,非常感谢。 =) – jpmc26

相关问题