在Release模式下运行时,C#Do Debug语句会被编译出来吗?

use*_*879 9 c# debugging

似乎使用say Debug.WriteLine来写输出而不是大量#if DEBUG语句是理想的(就可读性而言).

当程序在发布模式下编译时,所有的开销Debug.WriteLine都会消失,好像它不存在一样,或者该函数是否仍然被调用,但内部没有任何内容?

如果是这样,有没有办法在自定义类上获得此功能,即只有在我们处于调试模式时才会编译静态调用?

Iva*_*lov 17

它被称为ConditionalAttribute,它已经存在:Debug.WriteLine()在Release模式下编译时,完全删除了调用.

声明如下:

[ConditionalAttribute("DEBUG")]
public static void WriteLine(string message)
Run Code Online (Sandbox Code Playgroud)

因此,如果DEBUG未声明符号,则会删除对它的任何调用,例如,在发布版本的默认配置中.(您可以更改为项目属性中的不同构建配置定义的预处理器符号.)

对于(几乎?)每种方法都是如此Debug.事实上,它DebugTrace- Trace的方法之间的主要区别还在于发布.

  • 不是答案,但即使您不了解条件属性并将整个方法放入和#if debug,它也会得到优化.http://stackoverflow.com/questions/11783/in-net-will-empty-method-calls-be-optimized-out (3认同)
  • @mootinator:嗯,这不一样.使用`Coditional`,编译时会抛出一切.使用空方法,JITter仍然需要在运行时分析事物,从而降低性能.不过很多但是无论如何.相反,这种方式JITter根本不会看到这种方法调用. (2认同)