Как работает эта часть кода - PullRequest
0 голосов
/ 21 июля 2010

UPD. Привет, Я знаю, как работает код ниже. Я знаю, что крест и круг указывают на метод 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 Ответ

1 голос
/ 21 июля 2010

Оба Cross и Circle являются генераторами.Они возвращают последовательность object с помощью IEnumerable.То есть вы могли бы написать:

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

И на каждой итерации цикла следующий возвращаемый элемент генерируется внутри метода Cross или Circle.Эти методы не выполняются одновременно, вместо этого каждый раз, когда достигается оператор yield return, выполнение программы будет продолжаться в вызывающем коде (цикл foreach), а код внутри генератора возобновляется только при следующемнеобходим элемент.


PS: Прежде чем мое интернет-соединение оборвалось на несколько часов, я также хотел прокомментировать странный факт, что ваши генераторы продолжают возвращать ссылкик себе через yield return.Это не имеет смысла для меня, честно говоря;Я никогда не видел такого кода, и мне интересно, действительно ли он полезен?

...