c# - .NET 中是否明确将无限循环作为特例处理?

标签 c# .net visual-studio bytecode compiler-optimization

今天早些时候,当我编写一个方法时,突然发现我不确定我正在实现的习惯用法为什么会编译。如果其他一切都被抽象掉,它看起来像这样:

    private int Example()
    {
        while (true)
        {
            if (some condition)
            {
               return 1;
            }
        }
    }

你有一个显式的无限循环,循环内的一些条件导致循环以 return 语句结束。让我们暂时忽略为什么我这样做而不是检查 while 子句中的终止条件,因为答案令人费解且无关紧要——我想知道的是为什么编译器没有用“Not”标记它所有路径都返回一个值。”错误,因为严格来说并不是所有的路径都会返回一个值。从未进入 while 循环的情况(当然,永远不会发生)不会返回任何内容。

现在,我可以想象它发生的原因有两个:这是由于其他原因而发生的优化的副作用,或者编译器明确处理这种情况以允许使用这种习惯用法。我的直觉是这可能是第一种情况。我一点也不惊讶,例如,这个编译:

private int Example2()
{
   if (true) return 1;
}

因为编译器在 if 中看到常量 true,并优化了条件。不过,我真的不明白为什么这会“修复”第一个例子。

哦,更奇怪的是,如果一些消除循环的优化在起作用,那么编译:

    private int Example3()
    {
        while (true)
        {
            if (false)
            {
               return 1;
            }
        }
    }

我认为整个内部循环将被优化掉,摆脱所有有效的返回。在字节码/编译器级别实际发生了什么,使这一切都有意义?

最佳答案

编译器不会对此进行标记,因为该方法的结尾无法到达。这不是问题 - 如果您可以在不返回值的情况下到达方法的末尾(右大括号),这才是问题。

这不是编译器优化的问题 - 这是遵循规范中规定的可达性定义的情况。

请注意,您根本不需要返回语句...此代码无用,但完全有效:

public int EndlessLoop()
{
    while (true)
    {
    }
}

关于c# - .NET 中是否明确将无限循环作为特例处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7323326/

相关文章:

c# - 类似于Json字符串的字典列表

visual-studio - 在 Visual Studio 中使用 Makefile 的好技术?

c# - 在 asp.net 中将 JSON 转换为 .Net 对象时出错

c# - 返回表达式而不是结果

c# - SOAP - namespace ,这是做什么用的?

c# - bool ?比较 bool vs GetValueOrDefault vs ??运算符(operator)

c# - 在哪里可以获取Winforms .NET的自定义控件?

c# - 从 Markdown 文本中获取原始文本

c# - 当我们设置掩码时,有什么方法可以删除 MASKEDTEXTBOX 字段中显示的行吗?

c++ - MinGW/GCC 延迟加载 DLL 等价物?