这部分代码是如何工作的

时间:2010-07-20 20:13:12

标签: c# ienumerator

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;
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

CrossCircle都是生成器。它们通过object返回IEnumerable s序列。也就是说,你可以写:

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

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


P.S。:在我的互联网连接中断了几个小时之前,我还想评论一下这样一个奇怪的事实:你的发电机通过yield return不断返回对自己的引用。说实话,这对我来说真的没有意义;我从来没有见过那种代码,我想知道它是否真的有用吗?