.Net优化

noo*_*ber 2 c# optimization

class Debug
{
    internal static void Assert(bool condition)
    {
        #if DEBUG
        Log.Out("Asserted");
        #endif
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器是否会摆脱调用Assert,因为它在Release版本中是空的并且选中了Optimize复选框,或者是否会调用空方法开销?

问候,

Jon*_*eet 13

不,C#编译器不会删除Assert对它的调用- 它只是一个空方法.JIT编译器可以在调用代码时对其进行优化; 实际上,这是内联的特殊情况,其中内联的结果是"无需执行".但是,请注意Assert 仍将评估参数.

但是,如果要使调用本身成为条件,则更简洁的方法是更改​​方法以使用该System.Diagnostics.Conditional属性:

[Conditional("DEBUG")]
internal static void Assert(bool condition)
{
    Log.Out("Asserted");
}
Run Code Online (Sandbox Code Playgroud)

这改变了语义:现在整个方法调用包括参数评估将被C#编译器删除,所以你可以:

Assert(GetCountOfAllRowsInDatabase() != 0);
Run Code Online (Sandbox Code Playgroud)

并且在调试模式下它会命中数据库,但在发布模式下它不会.