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

StackOverflow https://stackoverflow.com/questions/1209054

Вопрос

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

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");

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

Это было полезно?

Решение

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

Другие советы

См. выход (ссылка на C #)

  

Ключевое слово yield использует то, что известно как   ленивая оценка. Что это значит   практически ничего   " доходность возврата " не будет оцениваться   пока не будет запрошено от   переписчик.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top