return
instrucción se utiliza para devolver un valor de una función.
Si usted tiene una función de iterador de esta manera:
public IEnumerable<int> IteratorOverInt() { }
una sentencia return en la función anterior tendría que devolver un llenaron IEnumerable<int>
.
public IEnumerable<int> IteratorOverInt() {
return new List<int> { 1, 2, 3, 4 };
}
pero si usted está trabajando en una función de repetidor, que va a utilizar yield return
, por lo que el código podría tener este aspecto:
public IEnumerable<int> IteratorOverInt() {
for (int i = 0; i < 4; i++) {
yield return i;
}
}
Así yield return
devuelve un int
mientras que la firma del método exige IEnumerable<int>
¿Qué haría una declaración return
en el caso anterior? ¿Los resultados de devolución anulan los rendimientos? Concatenando lo que sea con los rendimientos? return
no tiene mucho sentido en el caso anterior.
Por lo tanto, necesitamos una forma de return
que tenga sentido en un bloque iterador, por lo que hay yield break
.
Por supuesto que puedes hacerlo con un break
, pero ¿cómo salir del cuerpo de la función si tienes más código que ejecutar? ¿Envolver todo en un complicado bloque if-else? Yo diría que solo tener yield break
sería mejor.
Esa no es la forma en que leo el comportamiento: 'romper rendimientos' cancela todo el método y no devuelve nada. Podría tener elementos '10 return yield (ed)', pero si un 'yield break' es golpeado dentro del mismo método, obtiene 0 ítems en total. –
@Dave: No lo creo ... ¿cómo va a funcionar la evaluación diferida en un bloque de iteradores? – chakrit
@Dave, nope, yield break detiene la devolución de más elementos, pero no cancela (y no puede) lo que ya se ha devuelto. – configurator