【问题标题】:Will c# compiler optimize empty if blocksc# 编译器会优化空的 if 块吗
【发布时间】:2013-10-24 13:46:29
【问题描述】:

C# 是否有机会优化以下代码块?

if (specField == null || AddSystemType(specField, layout) 
                      || AddEnumType(specField, layout)
                      || AddUserType(specField, layout))
{
}

【问题讨论】:

  • 编译代码然后用ILDASM找出来:-P
  • 坦率地说,我不明白你的意思。能不能说的具体点?
  • 我没想到。这些方法可能会产生副作用。
  • 有趣的问题,应该如何优化?

标签: c# compiler-optimization


【解决方案1】:

您可以使用 ildasm 来查看编译器为自己优化了什么。但是,如果您希望它完全删除代码,它就不能——因为这三个方法调用可能会引发异常或修改状态。所以它可以做的最好的就是发出相当于:

if (specField != null)
{
    if (!AddSystemType(specField, layout))
    {
        if (!AddEnumType(specField, layout))
        {
            AddUserType(specField, layout);
        }
    }
}

【讨论】:

  • 你的例子不等于 cond ||条件。您可以使用 && 并且短路评估将阻止第二个条件的执行
【解决方案2】:

AddSystemType 将执行并可能更改某些状态,因此 IF 中的所有内容都将执行。

使用 AND 时

if(specField == null && AddSystemType()) {

}

如果 specField (总是)为 null,则不会执行并跳过 AddSystemType()(短路评估)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 2011-10-30
    • 2012-02-19
    • 1970-01-01
    相关资源
    最近更新 更多