TL; DR: разница в производительности здесь почти наверняка незначительна в реальном приложении, и в любом случае есть более читаемый способ достижения того же результата.Тем не менее, по-прежнему интересно видеть различия в скомпилированном коде.
Если предположить, что полный код действительно:
int result = 0;
foreach (int i in intList)
{
result += i;
}
против
int result = 0;
intList.ForEach(i => result += i);
, тогда первая форма довольнопроще с точки зрения того, что генерируется - вы получите только локальную переменную, код для итерации по списку (используя List<T>.Enumerator
) и IL, который добавляет значение к локальной переменной.
Втораяform нужно будет сгенерировать новый класс с переменной экземпляра для result
вместе с методом, который будет использоваться в качестве делегата.Код будет преобразован в:
CompilerGeneratedClass tmp = new CompilerGeneratedClass();
tmp.result = 0;
Action<int> tmpDelegate = new Action<int>(tmp.CompilerGeneratedMethod);
intList.ForEach(tmpDelegate);
Кроме того, существуют философские различия между foreach
и ForEach
, которые Эрик Липперт написал о .
Лично я бы просто использовал LINQ, хотя:
int result = intList.Sum();
Я сомневаюсь, что различия в производительности на самом деле станут узким местом в реальном коде, но версия LINQсамое чистое ИМО, и это всегда хорошая вещь.