¿Cómo devuelve una lista la función Dinner.GetRuleViolations del ejemplo NerdDinner?
-
05-07-2019 - |
Pregunta
Por lo que he leído,
yield return <value>
salta de la función en el momento en que se ejecuta la línea. Sin embargo, el texto de Scott Guthrie indica que
var errors = dinner.GetRuleViolations();
extrae con éxito una lista de todas las infracciones de las reglas, aunque GetRuleViolations es una larga lista de
if(String.someFunction(text))
yield return new RuleViolation("Scary message");
if(String.anotherFunction(text))
yield return new RuleViolation("Another scary message");
¿Cómo funciona esto?
Solución
No devuelve una lista. Devuelve un IEnumerable<RuleViolation>
. yield return
devuelve un valor en un método iterador . Un iterador es una manera fácil de generar una secuencia de elementos en un método.
Otros consejos
Consulte rendimiento (referencia de C #)
La palabra clave de rendimiento utiliza lo que se conoce como evaluación perezosa Lo que esto significa prácticamente es que todo lo que sigue a " rendimiento de retorno " no será evaluado hasta que lo solicite el enumerador.
También eche un vistazo al blog de Eric Lippert sobre Iterator Blocks.
Parte 1
Parte 2 - ¿Por qué no hay parámetros de ref o out?
Parte 3 - Por qué no hay rendimiento finalmente
Parte 4: ¿Por qué no hay rendimiento en la captura?
Parte 5 - Empujar vs tirar
Parte 6 - Por qué no hay código inseguro
Funciona porque yield return
devuelve un valor a un objeto enumerador, básicamente automatizando algún código de plomería para usted (es decir, es azúcar sintáctico). No hace que el método regrese, eso sería yield break
.
Más información: