Como a função Dinner.GetRuleViolations de exemplo a NerdDinner retornar uma lista?
-
05-07-2019 - |
Pergunta
Pelo que tenho lido,
yield return <value>
salta para fora da função do momento em que a linha é executada. No entanto, o texto de Scott Guthrie indica que
var errors = dinner.GetRuleViolations();
puxa com sucesso uma lista de todas as violações de regras mesmo que GetRuleViolations é uma longa lista de
if(String.someFunction(text))
yield return new RuleViolation("Scary message");
if(String.anotherFunction(text))
yield return new RuleViolation("Another scary message");
Como isso funciona?
Solução
Ele não retorna uma lista. Ele retorna um IEnumerable<RuleViolation>
. yield return
retorna um valor em uma iteração método . Uma iteração é uma maneira fácil de gerar uma sequência de elementos de um método.
Outras dicas
Os usos rendimento palavra-chave que é conhecido como avaliação preguiçosa. O que isto significa praticamente é que seguir qualquer coisa um "retorno de rendimento" não serão avaliadas até que seja solicitado ao recenseador.
Também dê uma olhada no blog de Eric Lippert no Iterator Blocks.
Parte 1
Parte 2 - Por que Não Ref ou os parâmetros
Parte 3 - por que não um rendimento em finalmente
Parte 4 - por que não um rendimento na captura
Parte 5 - Empurre vs Pull
parte 6 - Por que nenhum código inseguro
Ele funciona porque yield return
retorna um valor a um objeto enumerador, basicamente, automatizar alguns código de canalização para você (ou seja, é o açúcar sintática). Ele não causa o método de retorno, que seria yield break
.
Mais informações: