C#在发布模式下运行时,调试语句是否会被编译出来?

C#在发布模式下运行时,调试语句是否会被编译出来?,c#,debugging,C#,Debugging,使用sayDebug.WriteLine写入输出,而不是大量的#if Debug语句,似乎是理想的(在可读性方面) 当程序在发布模式下编译时,Debug.WriteLine的所有开销是否都消失了,就好像它不存在一样,或者该函数仍然被调用,但没有在内部执行任何操作 如果是这样,有没有办法在自定义类上获得此功能,即只有在调试模式下才会编译静态调用?它被调用并且已经存在:Debug.WriteLine()在发布模式下编译时,调用会被完全删除 声明如下: [ConditionalAttribute("D

使用say
Debug.WriteLine
写入输出,而不是大量的
#if Debug
语句,似乎是理想的(在可读性方面)

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

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

它被调用并且已经存在:
Debug.WriteLine()
在发布模式下编译时,调用会被完全删除

声明如下:

[ConditionalAttribute("DEBUG")]
public static void WriteLine(string message)
因此,如果未声明
DEBUG
符号(例如,在发布版本的默认配置中),则删除对它的任何调用。(可以在项目属性中更改为不同生成配置定义的预处理器符号。)


Debug
中的每个方法(几乎?)也是如此。事实上,这是
Debug
Trace
-
Trace
的方法之间的主要区别。

不是答案,但即使您不知道条件属性并将整个方法放入,而且如果进行调试,它也会得到优化@摩尔人:嗯,不一样。使用
Coditional
时,所有内容都会在编译时抛出。使用空方法时,抖动仍然必须在运行时进行分析,从而降低性能。不多,但无论如何。相反,这种方式根本看不到此方法调用。请记住,如果在将字符串连接传递到Debug.Write/WriteLine之前执行了一些疯狂的字符串连接,那么您的字符串连接将包含在发布版本中。如果将连接逻辑放入函数中,它将被剥离。所以您可以像这样执行字符串concat:Debug.WriteLine(DoHugeStringCalculation())。。否则,您可以使用#if来解决所有问题。