🖥 Неочевидные особенности C#: Ключевое слово yield и ленивые вычисления



Сегодня разберем мощную, но часто недооцененную особенность C# — использование yield для создания ленивых последовательностей. Эта техника позволяет экономить память и избегать излишних вычислений



Ключевое слово yield позволяет вернуть значение из метода-итератора без завершения его работы. Оно сохраняет состояние метода, чтобы продолжить выполнение при следующем вызове.



Для примера сделаем простую генерацию чисел:

IEnumerable<int> GetNumbers() {

for (int i = 1; i <= 5; i++) {

yield return i;

// Возвращает текущее значение и приостанавливает выполнение

}

}

foreach (var num in GetNumbers()) {

Console.WriteLine(num);

}


Вывод:

1  

2

3

4

5




Здесь метод GetNumbers не создает полный список в памяти. Значения генерируются только тогда, когда итератор запрашивает следующий элемент.



Практическое применение yield особенно полезен при работе с большими данными. Например, для фильтрации логов:

IEnumerable<string> FilterLogs(IEnumerable<string> logs) {

foreach (var log in logs) {

if (log.Contains("ERROR")) {

yield return log;

// Возвращает только нужные строки

}

}

}

var logs = new List<string> { "INFO: Start", "ERROR: Crash", "INFO: End" };

foreach (var log in FilterLogs(logs)) {

Console.WriteLine(log);

}


Вывод:

ERROR: Crash




🔥 Используйте yield, чтобы делать код компактнее, эффективнее и читаемее!



C# Ready | #практика