class Debug
{
internal static void Assert(bool condition)
{
#if DEBUG
Log.Out("Asserted");
#endif
}
}
编译器会摆脱调用Assert的麻烦,因为它在Release builds中为空,并且选中了Optimize复选框,还是会存在调用空方法的开销?
问候,
最佳答案
不,C#编译器不会删除对Assert
的调用-它只是一个空方法。 JIT编译器可以在调用代码时对其进行优化。实际上,这是内联的特殊情况,其中内联的结果是“什么也没执行”。但是,请注意,Assert
的参数仍将被求值。
但是,如果要使调用本身成为条件调用,则更干净的方法是将方法更改为使用System.Diagnostics.Conditional
属性:
[Conditional("DEBUG")]
internal static void Assert(bool condition)
{
Log.Out("Asserted");
}
这改变了语义:现在,包括参数评估在内的整个方法调用将被C#编译器删除,因此您可以:
Assert(GetCountOfAllRowsInDatabase() != 0);
在调试模式下它将命中数据库,而在发布模式下则不会。
关于c# - .NET优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7147685/