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)