Является ли 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.
}