注释C#中废弃else分支后反编译结果存疑,求官方依据确认
结论:你的理解正确,反编译工具的输出存在误导性
首先明确:你保留else空花括号的写法是合法的,action_3()始终会被执行,反编译后的代码只是工具为了简化显示做的优化,并非实际程序的执行逻辑。
具体解释:
你注释action_2()后的代码逻辑:
if (condition) { action_1(); } else { // 空块 } action_3();这段代码的执行流程是:
- 当
condition为true:执行action_1(),跳过空的else块,执行action_3() - 当
condition为false:进入空的else块(什么都不做),退出else后执行action_3()
无论哪种情况,action_3()都会被执行。
- 当
反编译工具的输出为什么看起来不一样?
C#编译器会对空代码块做优化,编译时会直接移除空的else块,生成的IL代码里,action_3()的执行逻辑是独立于if-else分支的。反编译工具为了让代码更简洁,把“空else块+执行action_3”合并写成了else action_3(),但这只是显示上的简化,实际程序的执行逻辑和你写的完全一致——action_3()始终执行。依据C#官方规范:
if-else语句中的空else块,语义上等价于没有else块的if语句。程序执行完if-else分支后,会继续执行后续的语句,不会因为空else块改变控制流。
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

