例如,有一个包含元素的数组。
int [] numbers = new int[] { 1, 2, 3, 4, 5 };
for (int i = 0; i < numbers.Length; ++i)
{
Console.WriteLine(numbers[i]);
}
- 当我打开 ILSpy 时,我发现 (++i)preincrement 变成了 postincrement(i++),虽然看起来应该是相反的。
- number.Length 计算 1 次或每次迭代??(理论上,每次,但你永远不知道环境如何以某种方式优化它)在循环之前将条件放入单独的变量中是否有意义?
你看错了方向。
JIT 编译器进行实际优化,而且非常智能。对于您的代码,它生成了以下目标代码(当然,在发布模式下并且没有调试器):
可以看到不仅前后自增的差异消失了,不仅重读消失了
Length,而且优化器能够理解长度等于常量5。相信我,编译器比你我更好地应对纳米优化。
在 IL 代码级别,前增量和后增量没有区别*:
ILSpy 将此 C# 命令序列反编译为后增量的事实完全是为了方便读者(后增量更熟悉)。
好吧,最后一个提示:没有关于什么是快什么是慢的书面规则(除了个人经验)。更糟糕的是,新版本编译器发布的任何“规则”很可能是错误的:优化器每天都在改进。这就是为什么:
*正如@PetSerAl 在评论中正确指出的那样,C# 中的前增量和后增量之间的区别(与 C++ 不同)只是表达式返回的值。因此,对于没有人使用增量结果的情况,它们的含义总是相同的(对于任何类型,不仅对于
int)。