Does using ConditionalAttribute also remove arguments computation?

后端 未结 2 1691
再見小時候
再見小時候 2020-12-18 23:26

I tried the following code:

class Magic {
   [Conditional(\"DEBUG\")]
   public static void DoMagic( int stuff )
   {
   }
   public static int ComputeMagic(         


        
相关标签:
2条回答
  • 2020-12-19 00:15

    Yes, everything is removed. This can be great for avoiding expensive computations that are only relevant for (say) logging, but it means you need to be careful not to remove necessary side-effects. For example:

    Trace(SomethingCritical());
    

    is very different to:

    var result = SomethingCritical();
    Trace(result);
    

    or in your specific case:

    DoMagic(ComputeMagic()); // everything here done only if DEBUG symbol defined
    

    versus

    var result = ComputeMagic(); // always done
    DoMagic(result); // done only if DEBUG symbol defined
    

    From the specification §17.4.2 (emphasis mine):

    If the symbol is defined, the call is included; otherwise, the call (including evaluation of the receiver and parameters of the call) is omitted.

    0 讨论(0)
  • 2020-12-19 00:16

    Yes, argument evaluation is removed when DEBUG is not defined (which is typical in Release builds).

    From https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/attributes#reserved-attributes:

    If the symbol is defined, the call is included; otherwise, the call (including evaluation of the parameters of the call) is omitted.

    0 讨论(0)
提交回复
热议问题