-1

UPD。你好,我知道下面的代码是如何工作的。我知道 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

两者都是生成CrossCircleobject它们通过 a 返回一个 s序列IEnumerable。也就是说,你可以写:

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

Cross并且在每次循环迭代中,将在orCircle方法中生成下一个要返回的元素。这些方法不会一次全部执行,而是每次yield return到达语句时,程序将在调用代码(foreach循环)中继续执行,并且仅在需要下一项时才恢复生成器内的代码。


PS:在我的互联网连接中断几个小时之前,我还想评论一个奇怪的事实,即您的生成器不断通过yield return. 老实说,这对我来说真的没有意义。我从未见过那种代码,我想知道它是否真的有用?

于 2010-07-20T20:19:35.797 回答