Компилятор превращает метод с yield в машину состояний: объект хранит текущее состояние, локальные данные и Current, а MoveNext продолжает выполнение до следующего yield или окончания.
Как устроен механизм yield внутри?
Компилятор превращает метод с yield в машину состояний: объект хранит текущее состояние, локальные данные и Current, а MoveNext продолжает выполнение до следующего yield или окончания.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Компилятор превращает метод с yield в машину состояний: объект хранит текущее состояние, локальные данные и Current, а MoveNext продолжает выполнение до следующего yield или окончания.
Первое перечисление запускает тело, yield return устанавливает очередной элемент и отдаёт управление потребителю. Следующий MoveNext продолжает с сохранённого места; yield break заканчивает последовательность.
Блоки finally выполняются при предусмотренном завершении и освобождении перечислителя, поэтому его нельзя бездумно бросать, если он владеет ресурсами. Никакой отдельный поток для обычного yield не создаётся. Повторный обход IEnumerable обычно выполняет логику снова, а не возвращает автоматически закешированные результаты.