1

私はyieldを使用していて、どこかで打ったのですが、yieldがどのように機能するかを誰かが説明できますか?私のシーンリオを以下に示します。

public static IEnumerable Power(int number, int exponent)
{
    int result = 1;
    int counter = 0;
    Console.WriteLine("Inside Power - Before While");
    while (counter++ < exponent)
    {
        Console.WriteLine("Inside Power - Inside While");
        result = result * number;
        yield return result;
        //Console.WriteLine("New line added");
    }
    Console.WriteLine("Inside Power - After While"); 
}

static void Main(string[] args)
{
    foreach (int i in Power(2, 8))
    {
        Console.WriteLine("{0}", i);
    }
}

したがって、ここで取得する出力は次のとおりです。

Inside Power - Before While
Inside power - Inside While
2
Inside power - Inside While
4
Inside power - Inside While
8
Inside power - Inside While
16
Inside power - Inside While
32
Inside power - Inside While
64
Inside power - Inside While
128
Inside power - Inside While
256
Inside power - AfterWhile

だから私の質問は、ポインターがforeachからEnumerableメソッドにどのようにシフトするかということです。メソッド全体が呼び出されず、毎回ループが実行されている間だけが呼び出されるのはなぜですか。

4

1 に答える 1

1

意味的には、yield returnステートメントはreturnステートメント(制御フローを呼び出し元のメソッドに渡す)と同等であり、その後にforeachループの次の反復でyieldステートメントへの「goto」が続きます。

Return
Goto

この動作は、共通言語ランタイムには存在しません。これは、C#コンパイラによって生成されたクラスによって実装されます。次に、これが実行され、CLRによってJITコンパイルされます。収量は、糖衣構文の一種です。

于 2013-02-13T12:48:05.637 に答える