【发布时间】:2010-09-28 01:46:45
【问题描述】:
根据ConditionalAttribute 类的文档:
将 ConditionalAttribute 应用于 方法向编译器表明一个 不应该调用该方法 编译成微软中级 语言 (MSIL) 除非有条件 关联的编译符号 定义了 ConditionalAttribute。
对我来说,这就是说Conditional 属性只会改变单个方法调用级别的行为。但是考虑下面的代码sn-p:
class InstanceType
{
public InstanceType DoSideEffects()
{
Console.WriteLine("Side effects!");
return this;
}
public InstanceType DoMoreSideEffects()
{
Console.WriteLine("More side effects!");
return this;
}
[Conditional("DEBUG")]
public void ConditionalMethod()
{
Console.WriteLine("Conditional method run.");
}
}
class Program
{
static void Main()
{
var x = new InstanceType();
// The compiler appears to strip out this entire line
// in a Release build.
x.DoSideEffects().DoMoreSideEffects().ConditionalMethod();
var y = new InstanceType();
// When each method call appears on its own line,
// the first two methods are included as expected.
y.DoSideEffects();
y.DoMoreSideEffects();
y.ConditionalMethod();
}
}
比较调试和发布版本的输出:
调试发布 副作用!副作用! 更多副作用!更多副作用! 条件方法运行。 副作用! 更多副作用! 条件方法运行。此行为是否在某处指定?我原以为两个构建应该具有相同的输出,除了“条件方法运行”行。
【问题讨论】:
-
我对@987654326@的理解和你的一样,我想你看到这里发生了优化的效果。发布模式下的 IL 是什么样的?
-
有趣的是,如果您没有定义 DEBUG,即使是 Visual Studio(或者是 ReSharper?)在第一种情况下也将整行着色为灰色/未使用。而在第二个中,它只会将 ConditionalMethod() 调用着色为灰色/未使用。
-
@Adam:诚然,这两个问题是相似的......但是,另一个问题询问了由于评估传递给 to 标记的方法的参数而产生的副作用带有
Conditional属性。这个是关于方法调用的序列,提供调用所述方法的实例。所以我觉得两者足够不同。如果其他人不同意并投票关闭,我想这也很好。 -
是的,尽管该问题的答案回答了您的问题(特别是关于
#if/#endif作为 ConditionalAttribute 正在取代的要点)。
标签: .net debugging conditional release