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)
并且在调试模式下它会命中数据库,但在发布模式下它不会.
| 归档时间: |
|
| 查看次数: |
501 次 |
| 最近记录: |