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

我尝试了以下代码:

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版本中没有抛出exception,因此不仅删除了用ConditionalAttribute标记的方法的调用,而且还消除了参数计算。

这样的行为有保障吗?

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

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

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

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

 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(强调我的):

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