-1

アップデート。こんにちは、私は以下のコードがどのように機能しているか知っています。cross と circle が Cross() と Circle() メソッドを指していることは知っています。しかし、コードのこの部分については、まだ少し混乱しています。説明してもらえますか?

public GameMoves()
            {
                cross = Cross();
                circle = Circle();
            }

すべてのコード

 static void Main(string[] args)
            {
                GameMoves game = new GameMoves();
                IEnumerator enumerator = game.Cross();
                while (enumerator.MoveNext())
                {
                    enumerator = (IEnumerator)enumerator.Current;
                }
            }
        }

        public class GameMoves
        {
            private IEnumerator cross;
            private IEnumerator circle;

            public GameMoves()
            {
                cross = Cross();
                circle = Circle();
            }

            private int move = 0;
            public IEnumerator Cross()
            {
                while (true)
                {
                    Console.WriteLine("X, step {0}", move);
                    move++;
                    if (move > 9)
                        yield break;
                    yield return circle;
                }
            }

            public IEnumerator Circle()
            {
                while (true)
                {
                    Console.WriteLine("O, step {0}", move);
                    move++;
                    if (move > 9)
                        yield break;
                    yield return cross;
                }
            }
        }
4

1 に答える 1

1

CrossとはどちらCircleもジェネレーターです。objectこれらは、 によって一連の を返しIEnumerableます。つまり、次のように書くことができます。

foreach (var cross in Cross())  // works with Circle, also
{
    // ...
}

また、ループの反復ごとに、返される次の要素がCrossorCircleメソッド内で生成されます。これらのメソッドは一度にすべて実行されるのではなく、ステートメントに到達するたびyield returnに、プログラムの実行が呼び出し元のコード (foreachループ) で続行され、ジェネレーター内のコードは、次の項目が必要になったときにのみ再開されます。


PS:インターネット接続が数時間途切れる前に、ジェネレーターが を介して自分自身への参照を返し続けるという奇妙な事実についてコメントしたいと思いましたyield return。正直なところ、それは私にはあまり意味がありません。私はその種のコードを見たことがなく、実際に何か役に立つのだろうか?

于 2010-07-20T20:19:35.797 に答える