Pourquoi le mot-clé yield est-il utilisé conjointement avec return et break, et pas seul?


11

En C #, vous pouvez construire des méthodes avec le type de retour IEnumerable<T>et utiliser yield returnet yield breakcontrôler le flux. Voici un exemple simple qui utilise les deux contrôles:

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

Ma question est la suivante: pourquoi a-t-il été initialement conçu pour utiliser deux mots-clés avec yieldet non pas comme celui-ci avec le single yield"yielding the return value":

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

Pour moi, c'est plus simple à lire et à comprendre.

Réponses:


13

La yield returnsyntaxe légèrement maladroite a été créée pour que le code existant qui utilisait le mot "yield" comme identifiant (nom de variable) ne se casse pas . (Il est parfaitement logique, par exemple, d'avoir une variable nommée yieldsi vous travaillez avec du code financier.) Puisque "yield return" aurait été une erreur de syntaxe à l'époque, la nouvelle syntaxe ne casserait aucun code existant.

Quant à yield break, aucune idée. Cela ne semble vraiment pas avoir de raison valable derrière cela.


Ne serait-ce pas yield x;également une erreur de syntaxe à l'époque?
Moop

1
@Moop: En le faisant yield return, vous n'avez même pas à vous soucier de savoir s'il s'agissait d'une erreur de syntaxe ou non. Le risque de collision devient nul.
Robert Harvey

2
Pour "rendement cassé", c'est essentiellement comme "retour"; dans une méthode void, mais en utilisant "return;" en combinaison avec "rendement rendement"; pourrait être déroutant. Ainsi, le choix de la «rupture de rendement» est une conséquence du choix du «rendement de rendement».
Cyanfish

3
@Moop si vous aviez un type nommé yieldalors yield x;ne serait pas une erreur de syntaxe, mais une déclaration variable valide.
Bojan Resnik

1
@moop: Voir aussi ericlippert.com/2009/05/11/reserved-and-contextual-keywords et blogs.msdn.com/b/ericlippert/archive/2010/09/27/… si l'objet de l'introduction de nouveaux mots clés sans briser tout code vous intéresse.
Eric Lippert
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.