【问题标题】:Is it possible to have a single line of code that is only compiled in debug mode? [duplicate]是否有可能只有在调试模式下编译的单行代码? [复制]
【发布时间】:2018-08-09 12:09:08
【问题描述】:

请注意,我知道 Debug.Print - Console.WriteLine 是我正在尝试做的一个非常简化的示例。

有没有办法让一行代码只存在于 Debug 模式,而在 Release 中根本不出现?

我有一些命令可以帮助我调试对性能至关重要的代码部分的执行,并且我在关键位置的函数中放置了大量的命令。

这是我所做的一个例子:

using System;
public class C {
    public Object _obj = new object();
    public void M() 
    {
        Alpha("This goes away in Release");
        Alpha(_obj.GetHashCode() + "...but this doesn't");

        #if DEBUG 
            //But I don't want this three line deal.
            Alpha(_obj.GetHashCode() + "...of course this does get removed");
        #endif

    }

    public static void Alpha(String s)
    {
        #if DEBUG
            Console.WriteLine(s);
        #endif
    }
}

问题是在发布模式下,编译器识别出第一个调用在发布模式下什么都不做,并将其删除。但它在第二次调用中没有这样做。我知道这一点是因为我在 SharpLab 中测试过:https://sharplab.io/#v2:EYLgHgbALANALiAhgZwLYB8CQBXZBLAOwHMACAZQE9k4BTVAbgFgAoTAB22ABs8BjE3lxTISAYRIBvFpnace/APLAAVjV5wSAfQD2KkgF4SBGgHcSu1eoAUASiatZ3PiQBu2vABMSAWVslpmFIOmACCXGwAFohWAEQAKhF4IkTaNCKIJogUJIQkAEo0XDQoNDF2AaHhUVY6KgB0AOI0cAASKBGi2h40fgDUJDF1Q8DYGnCJIh6pyAQAAgC0AIxwZfYymBUAxHgAZiQAIgCiAEIAqg3+wZgA9NfHoyQAkiRTc0samQRjEyTjAE40GgkHjGF7FLh1CqVSLRWrKRrNNrIDpdHo2Ej9QZDbR7XjabB/ZBA8ZJF7TEhEZokAGobQuGgeVZbGgEDy7KEBAC+AQCHCc/GoiDgzjcnhIYRhVjIcD+hFIyBsASC622eyOZwaUM6BGQ2iKdQA6rLaAAZQg9BVrGSbFlsnZc6ScoA==

有什么办法可以避免三行版本?

【问题讨论】:

标签: c#


【解决方案1】:

是的,只需将[Conditional(...)] 属性放在您需要“不存在”的方法上,除非您使用的是调试配置:

[System.Diagnostics.Conditional("DEBUG")]
public static void Alpha(String s)
{
    Console.WriteLine(s);
}

除非存在指定的符号,否则对此类方法的所有调用都将被有效删除(未编译)。

注意有一个限制:[Conditional(...)] 只能用于void 方法。

【讨论】:

  • 是的,就是这样,谢谢我不知道它存在!
【解决方案2】:

你可能想要ConditionalAttribute:

using System;
using System.Diagnostics;

public class C {
    public Object _obj = new object();
    public void M() 
    {
        Alpha("This goes away in Release");
        Alpha(_obj.GetHashCode() + "...this is ommited");
    }

    [Conditional("DEBUG")]
    public static void Alpha(String s)
    {
        Console.WriteLine(s);
    }
}

查看 SharpLab 了解结果。

【讨论】:

    【解决方案3】:

    void 方法可以使用的巧妙技巧是 ConditionalAttribute,使用如下:

    [Conditional("DEBUG")]
    public static void Alpha(String s)
    {
        /***/
    }
    

    如果未定义符号,编译器将删除对这些方法的所有调用。

    还有这个怪物:

    if (System.Diagnostics.Debugger.IsAttached) /* your debug */
    

    在一行中工作,但需要一个附加的调试器,也不是“删除”代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-08
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      相关资源
      最近更新 更多