Como esta parte do código está funcionando
-
18-09-2020 - |
Pergunta
UPD.Olá, Eu sei como código abaixo está a funcionar.Eu sei que cruz e círculo estão apontando para a Cruz), e do Círculo() método.Mas eu ainda estou de enchimento pouco de confundir com a presente parte do código.Você pode explicar isso para mim?
public GameMoves()
{
cross = Cross();
circle = Circle();
}
Todo o 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;
}
}
}
Solução
Ambos Cross
e Circle
são geradores.Eles retornam uma seqüência de object
s por meio de um IEnumerable
.Isto é, você poderia escrever:
foreach (var cross in Cross()) // works with Circle, also
{
// ...
}
E em cada iteração do loop, o próximo elemento a ser retornado é gerado no interior da Cross
ou Circle
o método.Esses métodos não executar todos de uma vez, em vez disso, cada vez que um yield return
instrução é atingido, a execução do programa continuará no código de chamada (o foreach
loop), e o código dentro do gerador só é retomado quando o próximo item é necessário.
P. S.: Antes de minha conexão com a internet quebrou por algumas horas, eu também queria comentar sobre o fato estranho de que seus geradores mantém retornando referências a si mesmos através de yield return
.Que realmente não fazem sentido para mim, para ser honesto;Eu nunca visto esse tipo de código, e eu me pergunto se ele realmente faz algo de útil?