说到性能级别,哪个更值得使用,并且在编译器工作方面更轻,有什么重大差异吗?
List<int> intList;
foreach (int i in intList)
或
intList.ForEach(i => result += i);
TL;DR:这里的性能差异在实际应用程序中几乎肯定是微不足道的,并且无论如何都有一种更易读的方法来实现相同的结果。不过,看到编译代码的差异仍然很有趣。
假设完整代码实际上是:
int result = 0;
foreach (int i in intList)
{
result += i;
}
对
int result = 0;
intList.ForEach(i => result += i);
那么第一种形式就生成的内容而言相当简单 - 最终您将得到一个局部变量、迭代列表的代码(使用
List<T>.Enumerator
)以及将值添加到局部变量的 IL。
第二种形式需要生成一个新类,其中包含
result
的实例变量,以及用作委托的方法。代码将转换为:
CompilerGeneratedClass tmp = new CompilerGeneratedClass();
tmp.result = 0;
Action<int> tmpDelegate = new Action<int>(tmp.CompilerGeneratedMethod);
intList.ForEach(tmpDelegate);
最重要的是,foreach
和
ForEach
之间存在哲学差异,Eric Lippert已经写过。
就我个人而言,我只使用 LINQ:
int result = intList.Sum();
我怀疑性能差异会实际上成为实际代码中的瓶颈,但 LINQ 版本在我看来是最清晰的,这始终是一件好事。