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

sha*_*oth 11 .net c# 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());
   }
}
Run Code Online (Sandbox Code Playgroud)

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

这种行为有保证吗?

Ale*_*exD 17

是的,当DEBUG未定义时,将删除参数评估(这在发布版本中是典型的).

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

如果定义了符号,则包括呼叫; 否则,省略呼叫(包括呼叫参数的评估).


Mar*_*ell 10

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

Trace(SomethingCritical());
Run Code Online (Sandbox Code Playgroud)

是非常不同的:

var result = SomethingCritical();
Trace(result);
Run Code Online (Sandbox Code Playgroud)

或在您的具体情况下:

DoMagic(ComputeMagic()); // everything here done only if DEBUG symbol defined
Run Code Online (Sandbox Code Playgroud)

var result = ComputeMagic(); // always done
DoMagic(result); // done only if DEBUG symbol defined
Run Code Online (Sandbox Code Playgroud)

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

如果定义了符号,则包括呼叫; 否则,省略呼叫(包括接收机的评估和呼叫的参数).