¿Por qué se usa la palabra clave de rendimiento junto con return y break, y no por sí misma?

11

En C #, puede construir métodos con el tipo de retorno IEnumerable<T>y el uso yield returny yield breakpara controlar el flujo. Aquí hay un ejemplo simple que usa ambos controles:

public IEnumerable<int> GetEvens(int start, int end) {
    if(end < start)
        yield break;

    if(start & 2 != 0)
        start++;

    for(int i = start; i <= end; i+=2) {
        yield return i;
    }        
}

Mi pregunta es, ¿por qué se diseñó originalmente para usar dos palabras clave yieldy no usarlo de la siguiente manera con el único yield"rendimiento del valor de retorno":

public IEnumerable<int> GetEvens(int start, int end) {
    if(end < start)
        return; // stop completely and return nothing

    if(start & 2 != 0)
        start++;

    for(int i = start; i <= end; i+=2) {
        yield i; // yield the current value.
    }        
}

Para mí, esto es más fácil de leer y entender.

Trapeador
fuente

Respuestas:

13

La yield returnsintaxis ligeramente incómoda se creó para que el código existente que usaba la palabra "ceder" como identificador (nombre de la variable) no se rompiera . (Tiene mucho sentido, por ejemplo, tener una variable nombrada yieldsi está trabajando con código financiero). Dado que "rendimiento de rendimiento" habría sido un error de sintaxis en ese momento, la nueva sintaxis no rompería ningún código existente.

En cuanto a yield break, ni idea. Eso realmente no parece tener ninguna buena razón detrás de eso que pueda encontrar.

Mason Wheeler
fuente
¿No habría sido yield x;también un error de sintaxis en ese entonces?
Moop
1
@Moop: Al hacerlo yield return, ni siquiera tiene que molestarse en pensar si fue un error de sintaxis o no. La posibilidad de una colisión se convierte en cero.
Robert Harvey
2
Para "límite de rendimiento", es esencialmente como "retorno"; en un método nulo, pero usando "return"; en combinación con "rendimiento de rendimiento"; Podría ser confuso. Por lo tanto, la elección de la "ruptura del rendimiento" es una consecuencia de elegir la "rentabilidad del rendimiento".
Cyanfish
3
@Moop si tuviera un tipo llamado yieldentonces yield x;no sería un error de sintaxis, sino una declaración de variable válida.
Bojan Resnik
1
@moop: Consulte también ericlippert.com/2009/05/11/reserved-and-contextual-keywords y blogs.msdn.com/b/ericlippert/archive/2010/09/27/… si se trata de introducir nuevas palabras clave sin romper cualquier código te interesa.
Eric Lippert