Domanda

UPD. Ciao, So come il codice qui sotto sta funzionando.So che Cross, e Circle sta indicando il metodo Cross () e Circle ().Ma sto ancora riempendo poco confuso con questa parte del codice.Puoi spiegarlo per me?

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


.

Tutto il codice

 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;
                }
            }
        }
.

È stato utile?

Soluzione

Sia Cross e Circle sono generatori.Restituiscono una sequenza di objects per mezzo di un IEnumerable.Cioè, potresti scrivere:

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

E su ogni iterazione del loop, il prossimo elemento da restituire viene generato all'interno del metodo Cross o Circle.Tali metodi non eseguono tutti in un momento, invece ogni volta che viene raggiunta un'istruzione yield return, l'esecuzione del programma continuerà nel codice di chiamata (il foreach Loop) e il codice all'interno del generatore viene ripreso solo quando è necessaria la voce successiva.


.

P.S.: Prima che la mia connessione internet si è rottata per alcune ore, avevo anche voluto commentare lo strano fatto che i tuoi generatori continuano a restituire i riferimenti a se stessi tramite yield return.Questo non ha senso per me, ad essere onesti;Non ho mai visto quel tipo di codice e mi chiedo se effettivamente fa qualcosa di utile?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top