Является ли foreach чисто "синтаксическим сахаром"?
компилятор компилирует foreach
цикл в нечто вроде for
цикл если foreach
используется с массивом. И компилятор компилирует foreach
цикл в нечто вроде while
цикл если foreach
с IEnumerable
или IEnumerable<T>
. Значит ли это foreach
чисто syntactic sugar
? Или в этом есть что-то изощренное?
знает ли CLR о foreach
? Есть ли что-нибудь специально для foreach
в коде MSIL?
4 ответов
это чисто синтаксический сахар в том, что вы могли бы получить такое же поведение без него, да. Многие другие вещи такие же... for
, while
etc... Перефразируя Архимеда: "Дайте мне if
и goto
, и я буду перемещать код..."
нет, CLR не имеет никакого понятия foreach
.
это синтаксический сахар. Однако обратите внимание, что foreach работает, вызывая GetEnumerator (), затем MoveNext (), пока не будет возвращен дополнительный элемент, а затем всегда вызывает Dispose() на перечислителе, который он ранее получил. Если вы хотите сделать это так же, не забывайте, что Dispose()!
кроме того, среда CLR выполняет некоторые трюки, связанные с получением перечислитель. См.здесь и здесь, например.
foreach
внутренне просто while
цикл, который вызывает методы в IEnumerator
.
Это не просто синтаксический сахар, как элементы в цикле foreach непреложны (неизменны). Причина этого, как любезно указал Даниэль, заключается в том, что большинство коллекций будут использовать перечислитель в foreach, и именно перечислитель имеет ограничение не позволять вам обновлять содержимое списка во время его перечисления.
то есть
Foreach(String s in List<string>)
{
s = "f"; //this will throw an error.
}