Come funziona questa parte del codice
-
18-09-2020 - |
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;
}
}
}
. Soluzione
Sia Cross
e Circle
sono generatori.Restituiscono una sequenza di object
s 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?