Pergunta

UPD.Olá, Eu sei como código abaixo está a funcionar.Eu sei que cruz e círculo estão apontando para a Cruz), e do Círculo() método.Mas eu ainda estou de enchimento pouco de confundir com a presente parte do código.Você pode explicar isso para mim?

public GameMoves()
            {
                cross = Cross();
                circle = Circle();
            }

Todo o código

 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;
                }
            }
        }
Foi útil?

Solução

Ambos Cross e Circle são geradores.Eles retornam uma seqüência de objects por meio de um IEnumerable.Isto é, você poderia escrever:

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

E em cada iteração do loop, o próximo elemento a ser retornado é gerado no interior da Cross ou Circle o método.Esses métodos não executar todos de uma vez, em vez disso, cada vez que um yield return instrução é atingido, a execução do programa continuará no código de chamada (o foreach loop), e o código dentro do gerador só é retomado quando o próximo item é necessário.


P. S.: Antes de minha conexão com a internet quebrou por algumas horas, eu também queria comentar sobre o fato estranho de que seus geradores mantém retornando referências a si mesmos através de yield return.Que realmente não fazem sentido para mim, para ser honesto;Eu nunca visto esse tipo de código, e eu me pergunto se ele realmente faz algo de útil?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top