yieldキーワードがreturnとbreakと共に使用され、それ自体では使用されないのはなぜですか?


11

C#では、あなたは、戻り値の型を持つメソッド構築することができますIEnumerable<T>し、使用をyield returnしてyield break流れを制御します。両方のコントロールを使用する簡単な例を次に示します。

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

私の質問は、もともと次のように2つのキーワードをyield使用し、単一のyield「戻り値を返す」ように使用しないように設計されていた理由です。

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

私にとって、これは読みやすく理解しやすいです。

回答:


13

やや厄介なyield return構文は、「yield」という単語を識別子(変数名)として使用した既存のコードが壊れないように作成されまし。(たとえば、yield金融コードで作業している場合に変数に名前を付けることは、完全に理にかなっています。)「yield return」は当時構文エラーだったので、新しい構文は既存のコードを壊しません。

についてはyield break、わかりません。それは本当に私が見つけることができるその背後にある理由はないようです。


yield x;当時は構文エラーでもなかったでしょうか?
ムープ

1
@Moop:作成することによりyield return、構文エラーであるかどうかを気にする必要さえありません。衝突の可能性はゼロになります。
ロバートハーベイ

2
「イールドブレイク;」の場合、本質的には「リターン;」に似ています。voidメソッドで、ただし「return;」を使用 「利回り収益」と組み合わせて 紛らわしいかもしれません。したがって、「イールドブレーク」の選択は、「イールドリターン」を選択した結果です。
ザリガニ

3
あなたが持っていた場合は名前付きの型@Moop yield、その後はyield x;構文エラーではないだろうが、有効な変数の宣言。
ボジャンレスニク

1
@moopも参照してくださいericlippert.com/2009/05/11/reserved-and-contextual-keywordsblogs.msdn.com/b/ericlippert/archive/2010/09/27/...せずに新しいキーワードを導入する対象場合興味のあるコードを壊す。
エリックリッパー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.