Search code examples
c#.netconditional-attribute

Does using ConditionalAttribute also remove arguments computation?


I tried the following code:

class Magic {
   [Conditional("DEBUG")]
   public static void DoMagic( int stuff )
   {
   }
   public static int ComputeMagic()
   {
      throw new InvalidOperationException();
   }
}
class Program
{
   static void Main(string[] args)
   {
      Magic.DoMagic(Magic.ComputeMagic());
   }
}

and it looks like in Release build the exception is not thrown so not only the call to a method marked with ConditionalAttribute is removed, but also the parameters computation is eliminated.

Is such behavior guaranteed?


Solution

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

    From https://learn.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.