
Вопрос от подписчика: "Стоит ли использовать
Здесь важно понимать, чем отличаются эти циклы.
Принцип его работы одинаков везде:
Перебираемому объекту даже не обязательно реализовывать
Разворачивается такой цикл примерно в следующее:
Невооружённым глазом видно, что здесь происходит вызов через VMT, возможен cast, выделение памяти и так далее.
Обслуживание
Так что использование везде
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
- скорее микрооптимизация.