Pregunta

UPD.Hola, sé cómo funciona el código a continuación.Sé que la cruz y el círculo apuntan al método Cross() y Circle().Pero todavía estoy llenando un poco de confusión con esta parte del código.¿Puedes explicármelo?

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

Todo el 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;
                }
            }
        }
¿Fue útil?

Solución

Ambos Cross y Circle son generadores.Devuelven una secuencia de objects por medio de un IEnumerable.Es decir, podrías escribir:

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

Y en cada iteración del bucle, el siguiente elemento a devolver se genera dentro del Cross o Circle método.Esos métodos no se ejecutan todos a la vez, sino cada vez que un yield return Se alcanza la declaración, la ejecución del programa continuará en el código de llamada (el foreach loop), y el código dentro del generador solo se reanuda cuando se necesita el siguiente elemento.


PD.: Antes de que mi conexión a Internet se interrumpiera durante algunas horas, también quería comentar sobre el extraño hecho de que sus generadores siguen devolviendo referencias a sí mismos a través de yield return.Para ser honesto, eso realmente no tiene sentido para mí;Nunca he visto ese tipo de código y me pregunto si realmente hace algo útil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top