Warum wird das Yield-Schlüsselwort in Verbindung mit return und break verwendet und nicht für sich?


11

In C # können Sie Methoden mit dem Rückgabetyp IEnumerable<T>und erstellen yield returnund yield breakden Fluss steuern. Hier ist ein einfaches Beispiel, das beide Steuerelemente verwendet:

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

Meine Frage ist, warum es ursprünglich entworfen wurde, um zwei Schlüsselwörter mit yieldund nicht wie das folgende mit der einzigen yield"Rückgabe des Rückgabewerts" zu verwenden:

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

Für mich ist das einfacher zu lesen und zu verstehen.

Antworten:


13

Die etwas umständliche yield returnSyntax wurde erstellt, damit vorhandener Code, der das Wort "Ausbeute" als Bezeichner (Variablenname) verwendet, nicht beschädigt wird . (Es ist beispielsweise durchaus sinnvoll, eine Variable mit dem Namen zu haben, yieldwenn Sie mit Finanzcode arbeiten.) Da "Yield Return" damals ein Syntaxfehler gewesen wäre, würde die neue Syntax keinen vorhandenen Code beschädigen.

Was yield break, keine Ahnung. Das scheint wirklich keinen guten Grund zu haben, den ich finden kann.


Wäre das damals nicht yield x;auch ein Syntaxfehler gewesen?
Moop

1
@Moop: Wenn Sie es machen yield return, müssen Sie nicht einmal darüber nachdenken, ob es ein Syntaxfehler war oder nicht. Die Wahrscheinlichkeit einer Kollision wird Null.
Robert Harvey

2
Für "Yield Break;" ist es im Wesentlichen wie "Return"; in einer void-Methode, aber mit "return"; in Kombination mit "Yield Return"; könnte verwirrend sein. Die Wahl von "Yield Break" ist also eine Folge der Wahl von "Yield Return".
Cyanfish

3
@Moop wenn Sie benannte eine Art hat yielddann yield x;kein Syntaxfehler sein würde, aber eine gültige Variablendeklaration.
Bojan Resnik

1
@moop: Siehe auch ericlippert.com/2009/05/11/reserved-and-contextual-keywords und blogs.msdn.com/b/ericlippert/archive/2010/09/27/…, wenn das Thema der Einführung neuer Schlüsselwörter ohne Das Brechen eines Codes interessiert Sie.
Eric Lippert
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.