代码之家  ›  专栏  ›  技术社区  ›  MineR

有可能只有一行代码只能在调试模式下编译吗?[副本]

c#
  •  -1
  • MineR  · 技术社区  · 6 年前

    请注意,我知道Debug.Print-the-Console.WriteLine是一个非常简单的例子,说明了我要做的事情。

    有没有一种方法只存在于调试模式中的一行代码,它根本不存在于发行版中?

    我有一些命令可以帮助我调试一段性能关键的代码的执行,并且我已经将大量命令放在函数的关键位置。

    下面是我所做的一个例子:

    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
        }
    }
    

    问题在于,在发布模式下,编译器识别出第一个调用在发布模式下什么也不做,并将其删除。但在第二次通话中不会这样做。我知道这个是因为我在夏普实验室测试过: https://sharplab.io/#v2:EYLgHgbALANALiAhgZwLYB8CQBXZBLAOwHMACAZQE9k4BTVAbgFgAoTAB22ABs8BjE3lxTISAYRIBvFpnace/APLAAVjV5wSAfQD2KkgF4SBGgHcSu1eoAUASiatZ3PiQBu2vABMSAWVslpmFIOmACCXGwAFohWAEQAKhF4IkTaNCKIJogUJIQkAEo0XDQoNDF2AaHhUVY6KgB0AOI0cAASKBGi2h40fgDUJDF1Q8DYGnCJIh6pyAQAAgC0AIxwZfYymBUAxHgAZiQAIgCiAEIAqg3+wZgA9NfHoyQAkiRTc0samQRjEyTjAE40GgkHjGF7FLh1CqVSLRWrKRrNNrIDpdHo2Ej9QZDbR7XjabB/ZBA8ZJF7TEhEZokAGobQuGgeVZbGgEDy7KEBAC+AQCHCc/GoiDgzjcnhIYRhVjIcD+hFIyBsASC622eyOZwaUM6BGQ2iKdQA6rLaAAZQg9BVrGSbFlsnZc6ScoA==

    有没有办法避免三线版本?

    3 回复  |  直到 6 年前
        1
  •  4
  •   Peter B    6 年前

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

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

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

    注意,限制适用于: [条件(…)] 只能用于 void 方法。

        2
  •  2
  •   Paweł Dyl    6 年前

    你可能想要 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
  •  0
  •   V0ldek    6 年前

    一个很好的技巧 void 方法是 ConditionalAttribute ,使用方式如下:

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

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

    还有一个怪物:

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

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