Wie dieser Teil des Codes funktioniert
-
18-09-2020 - |
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;
}
}
}
Lösung
Beide Cross
und Circle
sind Generatoren.Sie geben eine Sequenz von zurück object
s 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?