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/

10-13 08:34