在发布版本 (C#) 中如何停止对调试函数调用中的参数求值

How to stop evaluation of parameters in calls to debug functions when in Release build (C#)

我有一些代码,其中充斥着类似以下的调试表达式:

System.Diagnostics.Debug.WriteLine(System.BitConverter.ToString(data.Take(32).ToArray()));

如何防止发布版本评估 System.BitConverter.ToString(data.Take(32).ToArray())

我已经添加了我自己的调试 class,它允许我根据我想要的报告级别控制对 WriteLine() 的调用,但是这两种方法即使在发布模式下也会评估 Linq 和字符串转换(不是吗)?

---稍后添加---

正如我上面所说,代码中有很多这样的行,我并不是特别想 #if DEBUG 全部列出来。

我想知道如何避免在发布模式下评估 Linq 和 BitConverter,我认为这会影响性能。

#if DEBUG应该给你解决了:

#if DEBUG
System.Diagnostics.Debug.WriteLine(System.BitConverter.ToString(data.Take(32).ToArray()));
#endif

更多示例here

答案和评论促使我检验我的假设,即在发布模式下评估转换。

Console.WriteLine("Console:{0}", ++n);
System.Diagnostics.Debug.WriteLine("Debug:{0}", ++n);
Console.WriteLine("Console:{0}", ++n);

在发布模式下我得到输出:

Console:1
Console:2

所以调试行在发布模式下根本没有被评估,我不需要做任何比使用调试输出更多的事情 and/or 添加 [Conditional("DEBUG")] 到我自己的调试例程(这已经是库调试代码的属性)。

[Conditional("DEBUG")] - 虽然是被调用函数的一个属性,但会阻止函数调用,从而阻止对其参数的评估。它的行为方式与 #if DEBUG

非常相似

您什么都不用做!传递给因 ConditionalAttribute 而被删除的方法的参数的评估已经被抑制。

有关权威文档,请参阅 C# 语言规范中的 The Conditional attribute 部分。引用:

[...] the call (including evaluation of the parameters of the call) is omitted.

看到方法居然带了ConditionalAttribute, see Debug.WriteLine(string) documentation.