Я думаю, что одна возможная ситуация, когда вы могли бы получить выигрыш в производительности, - это если размер перечисляемого типа и условие цикла является константой; например:
<code>const int ArraySize = 10;
int[] values = new int[ArraySize];
//...
for (int i = 0; i
В этом случае, в зависимости от сложности тела цикла, компилятор может заменить цикл встроенными вызовами. Я понятия не имею, если компилятор .NET делает это, и он имеет ограниченную полезность, если размер перечисляемого типа является динамическим.
Одна ситуация, когда foreach
может работать лучше, - это структуры данных, такие как связанный список, где произвольный доступ означает обход списка; перечислитель, используемый foreach
, вероятно, будет повторять по одному элементу за раз, делая каждый доступ O (1) и полный цикл O (n), но вызов индексатора означает начинать с заголовка и находить элемент по правильному индексу; O (N) каждый цикл для O (n ^ 2).
Лично я обычно не беспокоюсь об этом и использую foreach
каждый раз, когда мне нужны все предметы, и мне нет дела до индекса предмета. Если я не работаю со всеми элементами или мне действительно нужно знать индекс, я использую для . Единственный раз, когда я увидел, что это вызывает серьезную озабоченность, - это структуры типа связанных списков.