Реализация foreach на самом деле немного быстрее, чем стандартная реализация, потому что каждый доступ к массиву индекса должен проверяться границами. Тем не менее, так как идиома:
for(int i =0; i < myArray.Count; ++i)
{
// do something with myArray[i];
}
встречается часто, компилятор ищет его как особый случай и оптимизирует, чтобы он стал быстрее. Однако любое небольшое отклонение от этого формата (например, int len = MyArray.Count; for (int i = 0; i