【发布时间】:2011-07-31 16:06:11
【问题描述】:
使用Debug.WriteLine 来写入输出而不是大量的#if DEBUG 语句似乎是理想的(就可读性而言)。
当程序在发布模式下编译时,Debug.WriteLine 的所有开销是否都消失了,就好像它不存在一样,或者函数仍然被调用,但内部没有做任何事情?
如果是这样,是否有任何方法可以在自定义类上获得此功能,即只有在调试模式下才会编译静态调用?
【问题讨论】:
使用Debug.WriteLine 来写入输出而不是大量的#if DEBUG 语句似乎是理想的(就可读性而言)。
当程序在发布模式下编译时,Debug.WriteLine 的所有开销是否都消失了,就好像它不存在一样,或者函数仍然被调用,但内部没有做任何事情?
如果是这样,是否有任何方法可以在自定义类上获得此功能,即只有在调试模式下才会编译静态调用?
【问题讨论】:
它被称为ConditionalAttribute,并且已经存在:当您在发布模式下编译时,Debug.WriteLine() 调用将被完全删除。
声明如下:
[ConditionalAttribute("DEBUG")]
public static void WriteLine(string message)
因此,如果未声明 DEBUG 符号(例如,在发布版本的默认配置中),则删除对它的任何调用。 (您可以在项目属性中更改为不同构建配置定义的预处理器符号。)
Debug 中的每个方法(几乎?)也是如此。事实上,Debug 和Trace 之间的主要区别是Trace 的方法也保留在发布中。
【讨论】:
Coditional 时,所有内容都会在编译时被丢弃。使用空方法 JITter 仍然必须在运行时分析事物,从而降低性能。不多,但无论如何。这种方式恰恰相反,JITter 根本不会看到这个方法调用。