Выбор ответа Middle Коллекции и LINQ обновлено
Когда выполняется тело метода с yield
Вопрос
Метод IEnumerable<int> Load() с yield return в начале печатает «старт». Когда будет напечатано «старт» при var items = Load();?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: При первом MoveNext, например в foreach или ToList. Метод-итератор компилируется в класс-машину состояний.
Варианты ответа
- При первом
MoveNext, например вforeachилиToListправильный ответ - Сразу при вызове
Load(), до первогоyield return - Только после того, как вся последовательность прочитана
- При каждом обращении к
items, даже без перечисления
Разбор
Метод-итератор компилируется в класс-машину состояний. Вызов Load() лишь создаёт объект, код тела не выполняется. Первый MoveNext запускает тело до первого yield return. Поэтому проверки аргументов в итераторе срабатывают поздно, и их выносят в обычный метод-обёртку.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.