Wie funktioniert die Dinner.GetRuleViolations Funktion NerdDinner Beispiel eine Liste zurückgeben?
-
05-07-2019 - |
Frage
Von dem, was ich gelesen habe,
yield return <value>
springt aus der Funktion, sobald die Zeile ausgeführt wird. Allerdings Text Scott Guthrie zeigt an, dass
var errors = dinner.GetRuleViolations();
zieht erfolgreich eine Liste aller Regelverletzungen obwohl GetRuleViolations ist eine lange Liste von
if(String.someFunction(text))
yield return new RuleViolation("Scary message");
if(String.anotherFunction(text))
yield return new RuleViolation("Another scary message");
Wie funktionierts?
Lösung
Es gibt nicht eine Liste. Es gibt eine IEnumerable<RuleViolation>
. yield return
gibt einen Wert in einem Iteratormethode . Ein Iterator ist eine einfache Möglichkeit, eine Folge von Elementen in einem Verfahren zu erzeugen.
Andere Tipps
Siehe Ausbeute (C # Referenz)
Die Ausbeute Schlüsselwort verwendet, was bekannt als lazy evaluation. Was dies bedeutet, praktisch ist, dass alles Folgende ein „yield return“ wird nicht ausgewertet bis sie von der angeforderten enumerator.
Haben Sie auch einen Blick auf Eric Lippert Blog auf Iterator Blöcke.
Teil 1
Teil 2 - Warum keine Ref oder Out-Parameter
Teil 5 - Push-Pull vs
Teil 6 - Warum kein unsicherer Code
Es funktioniert, weil yield return
Wert auf ein Enumerator-Objekt zurückgibt, im Grunde für Sie einige Sanitär-Code automatisieren (das heißt es ist syntaktischer Zucker). Es ist nicht das Verfahren dazu führen, zurückzukehren, dass yield break
würde.
Weitere Informationen: