【C#】yieldキーワード

yieldキーワード

C#2.0で追加されたIEnumerableまたはIEnumeratorをより直感的に作成できる仕組み。
yield return文
以下のように使用する。

yield return expression; // expressionにはイテレータの要素を指定
yield return文の評価タイミングはコルーチンであるため、コンピュータが実行状態を保存後に停止させ、次に使用するときに即座に停止直前の状態に復帰する(レジューム)。
このため、yield returnが呼び出されると、その時点でメソッドは処理を中断し、制御を返す。
このとき、オブジェクトのMoveNext()に対してyield returnの内容が割り当てられる。
そして、MoveNext()が実行されるたびに、前回のyield return文からブロックが再開される。
以下のコードで、*の箇所にブレークポイントを設定し、デバッグすると動作が分かりやすい。

private static void CreateFruits()
{
    var fruits = CreateFruits(1000);// ①
    foreach (var fruit in fruits)
    {
        System.Console.WriteLine(fruit.Name + ":" + fruit.Price);
    }
}

private static IEnumerable<Fruit> CreateFruits(int number)
{// *1
    for (int i = 0; i < number; ++i)
    {
        yield retun new Fruit("Name", price); // *2
    }
}
①の呼び出しにより*1に移動する。その後、foreachのたびに*2に移動する。
yield break文
yield break文は、この文が実行された時点で、要素の終了を強制する。
つまり、yield break文はMoveNext()メソッドの戻り値をfalseにする。