是否在.NET中明确地将无限循环作为一种特殊情况处理?

jwr*_*ush 20 .net c# bytecode compiler-optimization visual-studio

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

    private int Example()
    {
        while (true)
        {
            if (some condition)
            {
               return 1;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

你有一个显式无限循环,循环内部的一些条件导致循环以return语句结束.让我们暂时忽略为什么我这样做,而不是检查while子句中的终止条件,因为答案是错综复杂且无关紧要的 - 我想知道的是为什么编译器不会将此标记为"Not"所有路径都返回一个值." 错误,严格地说并非所有路径都返回值.永远不会输入while循环(当然,从未发生过)的情况不会返回任何内容.

现在,我可以想象它发生的原因有两个:这是由于其他原因而发生的优化的副作用,或者这种情况显然由编译器处理以允许这个习惯用法.我的直觉是它可能是第一种情况.例如,这根本不会让我感到惊讶:

private int Example2()
{
   if (true) return 1;
}
Run Code Online (Sandbox Code Playgroud)

因为编译器在if中看到一个常量true,并优化条件.我不明白为什么这会"修复"第一个例子.

哦,甚至更奇怪的是,如果摆脱循环的一些优化正在发挥作用,这将编译:

    private int Example3()
    {
        while (true)
        {
            if (false)
            {
               return 1;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我认为整个内部循环将被优化掉,摆脱所有有效的回报.在字节码/编译器级别实际上是什么让这一切都有意义?

Jon*_*eet 29

编译器不会标记此信息,因为该方法的末尾无法访问.这不是问题 - 如果你可以在没有返回值的情况下到达方法的末尾(结束括号),这只是一个问题.

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

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

public int EndlessLoop()
{
    while (true)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

  • Eric Lippert,编译器开发人员之一,如果你好奇的话,已经发表了有关可达性的博客:http://blogs.msdn.com/b/ericlippert/archive/tags/reachability/ (2认同)