Каким образом функция Dinner из примера NerdDinner.GetRuleViolations возвращает список?
-
05-07-2019 - |
Вопрос
Из того, что я прочитал,
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
возвращает значение в метод итератора . Итератор - это простой способ создания последовательности элементов в методе. Р>
Другие советы
Ключевое слово yield использует то, что известно как ленивая оценка. Что это значит практически ничего " доходность возврата " не будет оцениваться пока не будет запрошено от переписчик.
Также посмотрите блог Эрика Липперта о блоках итераторов.
Часть 1
Часть 2. Почему нет параметров Ref или Out
Часть 3. Почему нет выхода в итоге
Часть 4. Почему нет вылова в улове
Часть 5 - Толчок против Тяги
Часть 6. Почему нет небезопасного кода
Это работает, потому что yield return
возвращает значение объекту enumerator, в основном автоматизируя для вас некоторый программный код (т. е.это синтаксический сахар).Это не приводит к возврату метода, который был бы yield break
.
Дополнительная информация: