Cómo funciona esta parte del código
-
18-09-2020 - |
Pregunta
UPD.Hola, sé cómo funciona el código a continuación.Sé que la cruz y el círculo apuntan al método Cross() y Circle().Pero todavía estoy llenando un poco de confusión con esta parte del código.¿Puedes explicármelo?
public GameMoves()
{
cross = Cross();
circle = Circle();
}
Todo el código
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;
}
}
}
Solución
Ambos Cross
y Circle
son generadores.Devuelven una secuencia de object
s por medio de un IEnumerable
.Es decir, podrías escribir:
foreach (var cross in Cross()) // works with Circle, also
{
// ...
}
Y en cada iteración del bucle, el siguiente elemento a devolver se genera dentro del Cross
o Circle
método.Esos métodos no se ejecutan todos a la vez, sino cada vez que un yield return
Se alcanza la declaración, la ejecución del programa continuará en el código de llamada (el foreach
loop), y el código dentro del generador solo se reanuda cuando se necesita el siguiente elemento.
PD.: Antes de que mi conexión a Internet se interrumpiera durante algunas horas, también quería comentar sobre el extraño hecho de que sus generadores siguen devolviendo referencias a sí mismos a través de yield return
.Para ser honesto, eso realmente no tiene sentido para mí;Nunca he visto ese tipo de código y me pregunto si realmente hace algo útil.