Выбор ответа Middle Коллекции и LINQ обновлено

Когда выполняется тело метода с yield

Вопрос

Метод IEnumerable<int> Load() с yield return в начале печатает «старт». Когда будет напечатано «старт» при var items = Load();?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: При первом MoveNext, например в foreach или ToList. Метод-итератор компилируется в класс-машину состояний.

Варианты ответа

  1. При первом MoveNext, например в foreach или ToListправильный ответ
  2. Сразу при вызове Load(), до первого yield return
  3. Только после того, как вся последовательность прочитана
  4. При каждом обращении к items, даже без перечисления

Разбор

Метод-итератор компилируется в класс-машину состояний. Вызов Load() лишь создаёт объект, код тела не выполняется. Первый MoveNext запускает тело до первого yield return. Поэтому проверки аргументов в итераторе срабатывают поздно, и их выносят в обычный метод-обёртку.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.