请注意,我知道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==
有什么办法可以避免使用三行版本?
答案 0 :(得分:4)
是的,只需在您需要“不存在”的方法上放置一个[Conditional(...)]
属性,除非您使用的是Debug配置:
[System.Diagnostics.Conditional("DEBUG")]
public static void Alpha(String s)
{
Console.WriteLine(s);
}
除非存在指定的符号,否则所有对此类方法的调用都会被有效删除(而不是编译)。
请注意,有一个限制:[Conditional(...)]
仅可用于void
方法。
答案 1 :(得分: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。
答案 2 :(得分:0)
void
可以用于ConditionalAttribute
方法的一个绝妙窍门是[Conditional("DEBUG")]
public static void Alpha(String s)
{
/***/
}
,用法如下:
if (System.Diagnostics.Debugger.IsAttached) /* your debug */
如果未定义符号,则编译器将删除对这些方法的所有调用。
还有这种怪物:
QString
可以一行工作,但是需要附加的调试器,并且也不能“删除”代码。