Perché la parola chiave yield viene utilizzata insieme a return e break e non da sola?


11

In C # puoi costruire metodi con il tipo restituito di IEnumerable<T>e usare yield returne yield breakper controllare il flusso. Ecco un semplice esempio che utilizza entrambi i controlli:

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;
    }        
}

La mia domanda è: perché è stato originariamente progettato per utilizzare due parole chiave con yielde non usarlo come il seguente con il singolo yield"rendimento del valore":

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.
    }        
}

Per me, questo è più semplice da leggere e capire.

Risposte:


13

La yield returnsintassi leggermente scomoda è stata creata in modo che il codice esistente che utilizzava la parola "yield" come identificatore (nome della variabile) non si spezzasse . (Ha perfettamente senso, ad esempio, avere una variabile denominata yieldse si lavora con un codice finanziario.) Dato che "rendimento del rendimento" sarebbe stato un errore di sintassi allora, la nuova sintassi non avrebbe violato alcun codice esistente.

Per quanto riguarda yield break, nessuna idea. Non sembra proprio che ci sia una buona ragione dietro di essa.


yield x;Allora non sarebbe stato anche un errore di sintassi?
Moop,

1
@Moop: facendolo yield return, non devi nemmeno preoccuparti di pensare se si è trattato di un errore di sintassi o no. La possibilità di una collisione diventa zero.
Robert Harvey,

2
Per "yield break;", è essenzialmente come "return;" in un metodo vuoto, ma usando "return;" in combinazione con "rendimento"; potrebbe essere fonte di confusione. Quindi la scelta del "limite di rendimento" è una conseguenza della scelta del "rendimento".
Cyanfish,

3
@Moop se avessi un tipo chiamato yieldallora yield x;non sarebbe un errore di sintassi, ma una dichiarazione di variabile valida.
Bojan Resnik,

1
@moop: vedi anche ericlippert.com/2009/05/11/reserved-and-contextual-keywords e blogs.msdn.com/b/ericlippert/archive/2010/09/27/… se si tratta di introdurre nuove parole chiave senza rompere qualsiasi codice ti interessa.
Eric Lippert,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.