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