In che modo la funzione Dinner.GetRuleViolations dell'esempio NerdDinner restituisce un elenco?
-
05-07-2019 - |
Domanda
Da quello che ho letto,
yield return <value>
salta fuori dalla funzione nel momento in cui la linea viene eseguita. Tuttavia, il testo di Scott Guthrie indica che
var errors = dinner.GetRuleViolations();
estrae correttamente un elenco di tutte le violazioni delle regole anche se GetRuleViolations è un lungo elenco di
if(String.someFunction(text))
yield return new RuleViolation("Scary message");
if(String.anotherFunction(text))
yield return new RuleViolation("Another scary message");
Come funziona?
Soluzione
Non restituisce un elenco. Restituisce un IEnumerable<RuleViolation>
. yield return
restituisce un valore in un metodo iteratore . Un iteratore è un modo semplice per generare una sequenza di elementi in un metodo.
Altri suggerimenti
Vedi rendimento (riferimento C #)
La parola chiave yield utilizza ciò che è noto come valutazione pigra. Cosa significa praticamente è tutto ciò che segue a " rendimento <<>> quot; non verrà valutato fino a quando non viene richiesto dal enumeratore.
Dai un'occhiata anche al blog di Eric Lippert su Iterator Blocks.
Part 1
Parte 2 - Why No Ref o Out Parameters
Parte 3 - Perché finalmente non cedere
Parte 4 - Perché nessuna resa nelle catture
Parte 5 - Push vs Pull
Parte 6 - Perché nessun codice non sicuro
Funziona perché yield return
restituisce un valore a un oggetto enumeratore, in pratica automatizza un po 'di codice idraulico per te (cioè è zucchero sintattico). Non causa la restituzione del metodo, che sarebbe yield break
.
Ulteriori informazioni: