Question

MISE À JOUR.Bonjour, je sais comment le code ci-dessous fonctionne.Je sais que la croix et le cercle pointent vers les méthodes Cross() et Circle().Mais je suis encore un peu confus avec cette partie du code.Pouvez-vous m'expliquer ?

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

Tout le code

 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;
                }
            }
        }
Était-ce utile?

La solution

Les deux Cross et Circle sont des générateurs.Ils renvoient une séquence de objects au moyen d'un IEnumerable.Autrement dit, vous pourriez écrire :

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

Et à chaque itération de boucle, l'élément suivant à renvoyer est généré à l'intérieur du Cross ou Circle méthode.Ces méthodes ne s'exécutent pas toutes en même temps, mais à chaque fois qu'un yield return est atteinte, l'exécution du programme continuera dans le code appelant (le foreach boucle), et le code à l’intérieur du générateur n’est repris que lorsque l’élément suivant est nécessaire.


P.S. : Avant que ma connexion internet ne soit coupée pendant quelques heures, j'avais aussi envie de commenter le fait étrange que vos générateurs continuent de se renvoyer des références via yield return.Pour être honnête, cela n'a pas vraiment de sens pour moi ;Je n'ai jamais vu ce genre de code et je me demande s'il fait réellement quelque chose d'utile ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top