Используя урожай в C#

У меня есть неопределенное понимание yield ключевое слово в , но я еще не видел потребность использовать его в моем коде. Это, вероятно, прибывает из отсутствия понимания его.

Так, из чего некоторые типичные хорошие использования yield?

22
задан Barn Monkey 21 March 2013 в 13:08
поделиться

4 ответа

yield просто упрощает реализацию перечислителя. Так что, если вы хотите написать метод, который возвращает IEnumerable , он избавляет вас от необходимости создавать класс перечислителя - вы просто возвращаете по одному результату за раз, а компилятор позаботится о детали под одеялом.

Один удобный случай - написать «бесконечный перечислитель», который вызывающий может вызывать сколько угодно раз. Вот пример, который генерирует бесконечную серию чисел Фибоначчи: http://chrisfulstow.com/fibonacci-numbers-iterator-with-csharp-yield-statements/ (ну ... теоретически бесконечен, но на практике ограничен размером UInt64).

14
ответ дан 29 November 2019 в 05:31
поделиться

Также неплохо подходит для тестирования и имитации, когда вы просто хотите быстро протестировать IEnumerable <>, что-то вроде ...

yield return somevalue;
yield return someothervalue;
yield return yetanotherone;
3
ответ дан 29 November 2019 в 05:31
поделиться

Yield реализует шаблон отложенной загрузки. Предлагаю рассмотреть его полезность с этой точки зрения.

Например. в контексте программного обеспечения для бизнеса, над которым я работаю, это может дать преимущество в виде снижения нагрузки на базу данных. Вы пишете код, который извлекает различные данные из базы данных, но будет загружена только та часть, которая действительно необходима для конкретного сценария. Если пользователь не углубится в пользовательский интерфейс, соответствующие данные не будут загружены.

4
ответ дан 29 November 2019 в 05:31
поделиться

Доходность используется в счетчиках. Компилятор C # автоматически приостанавливает выполнение цикла перечисления и возвращает текущее значение вызывающей стороне.

IEnumerable<int> GetIntegers(int max) {
    for(int i = 1; i <= max) {
         yield return i; // Return current value to the caller
    }
}

- или (более неуклюжий) -

IEnumerable<int> GetIntegers(int max) {
    int count = 0;
    while(true) {
         if(count >= max) yield break; // Terminate enumeration

         count++;
         yield return count; // Return current value to the caller
    }
}

Подробнее на MSDN .

4
ответ дан 29 November 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: