【问题标题】:C# Do Debug statements get compiled out when running in Release mode?C# 在发布模式下运行时是否编译出调试语句?
【发布时间】:2011-07-31 16:06:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# debugging


    【解决方案1】:

    它被称为ConditionalAttribute,并且已经存在:当您在发布模式下编译时,Debug.WriteLine() 调用将被完全删除。

    声明如下:

    [ConditionalAttribute("DEBUG")]
    public static void WriteLine(string message)
    

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

    Debug 中的每个方法(几乎?)也是如此。事实上,DebugTrace 之间的主要区别是Trace 的方法也保留在发布中。

    【讨论】:

    • 不是答案,但即使您不了解条件属性并将整个方法放入并#if 调试,它也会得到优化。 stackoverflow.com/questions/11783/…
    • @mootinator:嗯,不一样。使用 Coditional 时,所有内容都会在编译时被丢弃。使用空方法 JITter 仍然必须在运行时分析事物,从而降低性能。不多,但无论如何。这种方式恰恰相反,JITter 根本不会看到这个方法调用。
    • 请记住,如果您在将其传递给 Debug.Write/WriteLine 之前进行了一些疯狂的字符串连接,那么您的字符串连接将包含在您的发布版本中。如果您将连接逻辑放在函数中,它将被剥离。所以你可以像这样做你的字符串连接:Debug.WriteLine(DoHugeStringCalculation()); ..否则你可以使用#if DEBUG来解决它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2013-05-15
    • 2023-02-08
    相关资源
    最近更新 更多