Вопрос от подписчика: "Стоит ли использовать foreach, если for быстрее?"



Здесь важно понимать, чем отличаются эти циклы.



▪️for - это классический управляющий оператор, который транслируется в +/- одинаковый IR или машинный код практически во всех языках программирования согласно блок-схеме выше.



Принцип его работы одинаков везде:

for (выражение1; выражение2; выражение3)

оператор




▪️foreach - это синтаксический сахар над итераторами, который ещё и работает согласно принципам утиной типизации.

Перебираемому объекту даже не обязательно реализовывать IEnumerable.



Разворачивается такой цикл примерно в следующее:

var enumerator = enumerable.GetEnumerator();

while (enumerator.MoveNext())

{

var item = enumerator.Current;

// ...

}



Невооружённым глазом видно, что здесь происходит вызов через VMT, возможен cast, выделение памяти и так далее.

Обслуживание foreach очевидно дороже, потому что это абстракция.



Так что использование везде for вместо foreach - скорее микрооптимизация.