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;
                }
            }
        }
有帮助吗?

解决方案

两者兼而有之 CrossCircle 是发电机。他们返回一个序列 objects通过一个 IEnumerable.也就是说,你可以写:

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

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


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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top