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?

È stato utile?

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:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top