Вопрос

УПД.Здравствуйте, я знаю, как работает код ниже.Я знаю, что крест и круг указывают на методы 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;
                }
            }
        }
Это было полезно?

Решение

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

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

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


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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top