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

如何在发布版本(C#)中停止对调试函数调用中的参数求值,c#,visual-studio,debugging,release,C#,Visual Studio,Debugging,Release,我有一些代码,其中充斥着调试表达式,类似于: System.Diagnostics.Debug.WriteLine(System.BitConverter.ToString(data.Take(32).ToArray())); 如何防止发布版本评估System.BitConverter.ToString(data.Take(32.ToArray()) 我添加了自己的调试类,允许我根据所需的报告级别控制对WriteLine()的调用,但这两种方法即使在发布模式下也会评估Linq和字符串转换(不是

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

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

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

---后来添加---

正如我上面所说的,代码中有很多这样的行,如果调试的话,我并不特别想把它们都调试出来

我想知道的是如何避免在发布模式下评估Linq和位转换器,我认为这会对性能造成影响。

#如果DEBUG
可以解决这个问题:

#if DEBUG
System.Diagnostics.Debug.WriteLine(System.BitConverter.ToString(data.Take(32).ToArray()));
#endif
Console.WriteLine("Console:{0}", ++n);
System.Diagnostics.Debug.WriteLine("Debug:{0}", ++n);
Console.WriteLine("Console:{0}", ++n);

更多示例。

答案和注释提示我测试我的假设,即转换是在发布模式下评估的

Console.WriteLine("Console:{0}", ++n);
System.Diagnostics.Debug.WriteLine("Debug:{0}", ++n);
Console.WriteLine("Console:{0}", ++n);
在释放模式下,我得到输出:

Console:1
Console:2
因此,调试行在发布模式下根本不会被评估,我只需要使用调试输出和/或将
[条件(“调试”)]
添加到我自己的调试例程(这已经是库调试代码的一个属性)中


[条件(“调试”)]
-尽管被调用函数的属性阻止了函数调用,从而阻止了对其参数的求值。它的作用方式非常类似于
#如果DEBUG

您无需执行任何操作!由于
条件属性
而被删除的方法所传递的参数的计算已被抑制

有关权威文档,请参见C语言规范中的部分。引述:

[…]调用(包括参数评估) 省略了调用的名称)


要查看该方法是否实际携带了,请参阅。

您是否在询问如何仅在调试中执行某些代码?如果是这样,您可以在相应的部分周围放置一个
#If DEBUG
指令。这只是
DEBUG.WriteLine
的内部部分,没有在发布模式下执行,该方法仍然被调用,这就是为什么会进行评估。如果调试…(如@LInsoDeTeh所述),您可能需要将这些行包装在
#中,或者创建自己的方法来决定输出内容。如果您希望避免表达式的赋值,日志框架(或您自己的日志代码)将不会有帮助。您唯一的选择是条件编译,正如@SpaceSteak所说的,这在其他地方也有涉及(因此投票将其作为副本关闭)。提到的答案确实解释了条件编译的各种选项,但没有解释
[conditional(“DEBUG”)]
是否会影响调用中传递的参数的计算。所以它没有回答我的问题(或者至少是我想问的问题)。啊,当我写我的答案时,你发现了你自己。你是第一个,所以如果你愿意,你可以接受你自己的答案。