问题
I have some code which is littered with debug expressions similar to:
System.Diagnostics.Debug.WriteLine(System.BitConverter.ToString(data.Take(32).ToArray()));
What can I do to prevent the Release version evaluating System.BitConverter.ToString(data.Take(32).ToArray())
?
I have added my own debug class that allows me to control calls to WriteLine()
based on the level of reporting I want but both methods evaluate the Linq and string conversion even in Release mode (don't they)?
---ADDED LATER---
As I said above there are many of these lines in the code and I don't particularly want to #if DEBUG
them all out.
What I want is to know how to avoid evaluating the Linq and the BitConverter, which I assume will be a performance hit, in Release mode.
回答1:
You do not have to do anything! The evaluation of the parameters passed to a method that is removed because of the ConditionalAttribute
is suppressed already.
See the section The Conditional attribute in the C# Language Specification for authoritative documentation. Quote:
[...] the call (including evaluation of the parameters of the call) is omitted.
To see that the method actually carries the ConditionalAttribute, see Debug.WriteLine(string) documentation.
回答2:
The answers and comments prompted me to test my supposition that the conversion is evaluated in Release mode.
Console.WriteLine("Console:{0}", ++n);
System.Diagnostics.Debug.WriteLine("Debug:{0}", ++n);
Console.WriteLine("Console:{0}", ++n);
In Release mode I get the output:
Console:1
Console:2
So the Debug line isn't being evaluated at-all in Release mode and I don't need to do any more than use the Debug output and/or add [Conditional("DEBUG")]
to my own debug routines (which is already an attribute of the library Debug code).
[Conditional("DEBUG")]
- although an attribute of the called function, prevents the function call which prevents the evaluation of parameters to it. It acts in a way very similar to #if DEBUG
回答3:
#if DEBUG
should solve it to you:
#if DEBUG
System.Diagnostics.Debug.WriteLine(System.BitConverter.ToString(data.Take(32).ToArray()));
#endif
More examples here.
来源:https://stackoverflow.com/questions/31292769/how-to-stop-evaluation-of-parameters-in-calls-to-debug-functions-when-in-release