Ленивое выполнение последовательности в C#
Вызов метода-генератора не выполняет тело: метод только возвращает перечислитель. Тело стартует, когда цикл просит первый элемент. Код после yield return ждёт следующего шага.
Поэтому запись в консоль, чтение файла и другая работа внутри генератора привязаны к перебору, а не к строке, где последовательность создали.
Создадим последовательность и запросим только первый элемент. Метка "before" появляется раньше "start", потому что генератор ещё не шёл. Метка "middle" не появится: после первого элемента цикл останавливается:
static IEnumerable<int> Trace()
{
Console.WriteLine("start"); // выведет start
yield return 1;
Console.WriteLine("middle");
yield return 2;
}
var seq = Trace();
Console.WriteLine("before"); // выведет before
foreach (int n in seq)
{
Console.WriteLine(n); // выведет 1
break;
}
Опишите последовательность, которая без конца отдаёт номера 1, 2, 3 и так далее. Выведите только первые два номера.