代码效率优化及反编译结果差异问题咨询
问题解答
为什么反编译代码和原代码结构不同?
C#编译器不会把链式三元表达式保留为特殊的IL指令,而是将其编译成与嵌套if-else完全等价的条件分支逻辑。反编译器(如ILSpy、dnSpy)在还原代码时,通常会优先选择更通用的嵌套if-else结构来呈现这种分支逻辑,而非链式三元——这只是反编译器的代码还原策略差异,两种写法的执行逻辑和效率完全一致,你的测试通过也验证了这一点。
更高效的写法推荐
这里的“高效”兼顾执行效率和代码可维护性,推荐使用字典映射操作符与对应运算类型的写法,既简化分支逻辑,又提升扩展性:
实现示例
// 提前定义操作符到运算类型构造逻辑的映射 private static readonly Dictionary<string, Func<INumber, INumber, INumber>> _operationHandlers = new() { { "-", (left, right) => new Subtraction(left, right) }, { "+", (left, right) => new Addition(left, right) }, { "/", (left, right) => new Division(left, right) }, { "*", (left, right) => new Multiplication(left, right) } }; public INumber Level1() { INumber number = Level2(); Next(); // 通过字典查找直接匹配对应的操作逻辑 if (_operationHandlers.TryGetValue(txt, out var handler)) { return handler(number, Level1()); } return number; }
优势说明
- 可维护性提升:新增运算类型时,只需在字典中添加一行映射,无需修改条件分支代码;
- 可读性更强:所有支持的操作符及其对应逻辑一目了然,避免冗长的链式三元或嵌套
if; - 执行效率优化:字典查找为O(1)时间复杂度,当操作符数量增多时,比线性判断的链式三元/嵌套
if效率更高(操作符数量较少时差异可忽略)。
如果txt是char类型,只需将字典的键类型改为char即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者user24296292
相关产品推荐
相关产品推荐

