Как функция Dinner.GetRuleViolations из примера NerdDinner возвращает список?

Из того, что я прочитал,

yield return <value> 

выскакивает из функции в момент выполнения строки. Однако текст Скотта Гатри указывает на то, что

var errors = dinner.GetRuleViolations();

успешно вытаскивает список всех нарушений правил, хотя GetRuleViolations представляет собой длинный список

if(String.someFunction(text))
    yield return new RuleViolation("Scary message");
if(String.anotherFunction(text))
    yield return new RuleViolation("Another scary message");

Как это работает?


person Zian Choy    schedule 30.07.2009    source источник


Ответы (3)


Список не возвращается. Он возвращает IEnumerable<RuleViolation>. yield return возвращает значение в методе итератора. Итератор - это простой способ сгенерировать последовательность элементов в методе.

person mmx    schedule 30.07.2009

См. yield (справочник по C #)

Ключевое слово yield использует так называемое ленивое вычисление. На практике это означает, что все, что следует за «yield return», не будет оцениваться до тех пор, пока оно не будет запрошено у перечислителя.

Также ознакомьтесь с блогом Эрика Липперта о блоках итераторов.
Часть 1
Часть 2 - Почему нет параметров Ref или Out
Часть 3 - Почему нет доходности наконец
Часть 4 - Почему нет выхода в улове
Часть 5 - Push vs Pull
Часть 6. Почему нет небезопасного кода

person Robert Paulson    schedule 30.07.2009

Это работает, потому что yield return возвращает значение объекту перечислителя, в основном автоматизируя для вас некоторый сантехнический код (т.е. это синтаксический сахар). Это не приводит к возврату метода, это будет yield break.

Дополнительная информация:

person krohrbaugh    schedule 30.07.2009