Frage

UPD.Hallo, Ich weiß, wie der folgende Code funktioniert.Ich weiß, dass Kreuz und Kreis auf die Cross () - und Circle () -Methode zeigen.Aber ich bin immer noch wenig verwirrt mit diesem Teil des Codes.Kannst du es mir erklären?

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

Gesamter 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;
                }
            }
        }
War es hilfreich?

Lösung

Beide Cross und Circle sind Generatoren.Sie geben eine Sequenz von zurück objects mittels eines IEnumerable.Das heißt, Sie könnten schreiben:

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

Und bei jeder Schleifeniteration wird das nächste zurückzugebende Element innerhalb des generiert Cross oder Circle Methode.Diese Methoden werden nicht alle gleichzeitig ausgeführt, sondern jedes Mal, wenn a yield return anweisung erreicht ist, wird die Programmausführung im aufrufenden Code (dem foreach schleife), und der Code im Generator wird erst fortgesetzt, wenn das nächste Element benötigt wird.


PS.: Bevor meine Internetverbindung für einige Stunden zusammenbrach, wollte ich auch die seltsame Tatsache kommentieren, dass Ihre Generatoren immer wieder Verweise auf sich selbst zurückgeben über yield return.Das ergibt für mich ehrlich gesagt keinen Sinn;Ich habe diese Art von Code noch nie gesehen und frage mich, ob er tatsächlich etwas Nützliches bewirkt?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top