Comment la fonction Dinner.GetRuleViolations de l'exemple NerdDinner renvoie-t-elle une liste?
-
05-07-2019 - |
Question
D'après ce que j'ai lu,
yield return <value>
sort de la fonction au moment où la ligne est exécutée. Cependant, le texte de Scott Guthrie indique que
var errors = dinner.GetRuleViolations();
extrait avec succès une liste de toutes les violations de règles, même si GetRuleViolations est une longue liste de
if(String.someFunction(text))
yield return new RuleViolation("Scary message");
if(String.anotherFunction(text))
yield return new RuleViolation("Another scary message");
Comment ça marche?
La solution
Il ne renvoie pas de liste. Il retourne un IEnumerable<RuleViolation>
. yield return
retourne une valeur dans une méthode iterator Un itérateur est un moyen facile de générer une séquence d'éléments dans une méthode.
Autres conseils
Voir rendement (référence C #)
Le mot-clé de rendement utilise ce que l'on appelle évaluation paresseuse. Qu'est-ce que cela signifie est pratiquement que tout ce qui suit un " return return " ne sera pas évalué jusqu'à ce qu'il soit demandé à la énumérateur.
Consultez également le blog d’Eric Lippert sur Iterator Blocks.
Partie 1
Partie 2 - Pourquoi aucun paramètre Ref ou Out
Partie 3 - Pourquoi enfin pas de rendement
Partie 4 - Pourquoi pas de rendement dans les prises
Partie 5 - Push vs Pull
Partie 6 - Pourquoi pas de code non sécurisé
Cela fonctionne car yield return
renvoie une valeur à un objet énumérateur, en automatisant pour vous certains codes de plomberie (c’est-à-dire qu’il s’agit d’un sucre syntaxique). Cela ne provoque pas le retour de la méthode, ce serait yield break
.
Plus d'informations: