В C# оператор yield
используется для упрощенного создания итераторов, позволяя методам возвращать элементы последовательности по мере их генерации без необходимости создания вспомогательных коллекций.
Как работает yield
Оператор yield
используется в методах, которые возвращают IEnumerable<T>
или IEnumerator<T>
. Он позволяет сохранять состояние метода между вызовами, что делает его удобным для ленивой генерации данных.
Пример использования yield return
:
public static IEnumerable<int> GetNumbers()
{
for (int i = 1; i <= 3; i++)
{
yield return i;
}
}
Здесь метод GetNumbers()
не возвращает сразу всю коллекцию, а поочередно отдает элементы при каждом вызове MoveNext()
.
yield break
Оператор yield break
позволяет досрочно завершить генерацию последовательности.
public static IEnumerable<int> GetNumbers(int max)
{
for (int i = 1; i <= max; i++)
{
if (i > 5) yield break;
yield return i;
}
}
В этом примере итератор завершает выполнение, если i
становится больше 5.
Как yield
работает под капотом
При компиляции метода с yield return
компилятор создает скрытую реализацию IEnumerable<T>
и IEnumerator<T>
, позволяя сохранять состояние между вызовами. Это делает yield
удобным для работы с потоками данных, например, чтения файлов или обработки запросов.
Преимущества yield
- Экономия памяти – данные генерируются по мере запроса, без необходимости хранения всей коллекции в памяти.
- Читаемость кода – избавляет от необходимости вручную реализовывать
IEnumerator<T>
. - Ленивое выполнение – элементы создаются только при необходимости, а не заранее.
Оператор yield
упрощает создание итераторов, позволяя эффективно работать с последовательностями данных. Он особенно полезен при обработке больших объемов данных или потоковом вводе-выводе.