在发布版本 (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.
我有一些代码,其中充斥着类似以下的调试表达式:
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.