使用ConditionalAttribute还会删除参数计算吗?

时间:2014-02-21 13:13:07

标签: c# .net conditional-attribute

我尝试了以下代码:

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());
   }
}

并且在Release版本中看起来不会抛出异常,因此不仅会删除对标有ConditionalAttribute的方法的调用,而且还会消除参数计算。

是否保证了这种行为?

2 个答案:

答案 0 :(得分:15)

是的,如果未定义DEBUG,则会删除参数评估(这在发布版本中很常见)。

来自http://msdn.microsoft.com/en-us/library/aa664622%28v=vs.71%29.aspx

  

如果定义了符号,则包含呼叫;否则,电话   (包括对呼叫参数的评估)被省略。

答案 1 :(得分:9)

是的,一切已删除。这对于避免与(例如)日志记录相关的昂贵计算非常有用,但这意味着您需要注意不要删除必要的副作用。例如:

Trace(SomethingCritical());

非常不同于:

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

或在您的具体案例中:

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

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

从规范§17.4.2(强调我的):

  

如果定义了符号,则包含呼叫;否则,将忽略呼叫( 包括接收者评估和呼叫参数 )。