如果块,c# 编译器将优化空吗?

本文关键字:优化 编译器 如果 | 更新日期: 2023-09-27 18:36:48

C# 是否有可能优化以下代码块?

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

如果块,c# 编译器将优化空吗?

好吧,您可以使用ildasm来查看编译器为自己优化的内容。但是,如果您期望它完全删除代码,则不能 - 因为这三个方法调用可能会引发异常或修改状态。因此,它能做的最好的事情就是发出等效的:

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

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

使用 AND 时

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

然后,如果 specField 为(始终)空,则不会执行 AddSystemType() 并跳过(短路评估)