为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以有一行代码仅在调试模式下编译?

是否可以有一行代码仅在调试模式下编译?

C#
HUH函数 2021-11-21 16:05:01
请注意,我知道 Debug.Print - Console.WriteLine 是我正在尝试做的事情的一个非常简化的示例。有没有办法让一行代码只存在于调试模式中,而根本不出现在 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==有没有办法避免三行版本?
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

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


[System.Diagnostics.Conditional("DEBUG")]

public static void Alpha(String s)

{

    Console.WriteLine(s);

}

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


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


查看完整回答
反对 回复 2021-11-21
?
慕容森

TA贡献1853条经验 获得超18个赞

您可能需要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。


查看完整回答
反对 回复 2021-11-21
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

您可能需要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。


查看完整回答
反对 回复 2021-11-21
  • 3 回答
  • 0 关注
  • 191 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信