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?

¿Fue útil?

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:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top