Comment fonctionne cette partie du code
-
18-09-2020 - |
Question
MISE À JOUR.Bonjour, je sais comment le code ci-dessous fonctionne.Je sais que la croix et le cercle pointent vers les méthodes Cross() et Circle().Mais je suis encore un peu confus avec cette partie du code.Pouvez-vous m'expliquer ?
public GameMoves()
{
cross = Cross();
circle = Circle();
}
Tout le 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;
}
}
}
La solution
Les deux Cross
et Circle
sont des générateurs.Ils renvoient une séquence de object
s au moyen d'un IEnumerable
.Autrement dit, vous pourriez écrire :
foreach (var cross in Cross()) // works with Circle, also
{
// ...
}
Et à chaque itération de boucle, l'élément suivant à renvoyer est généré à l'intérieur du Cross
ou Circle
méthode.Ces méthodes ne s'exécutent pas toutes en même temps, mais à chaque fois qu'un yield return
est atteinte, l'exécution du programme continuera dans le code appelant (le foreach
boucle), et le code à l’intérieur du générateur n’est repris que lorsque l’élément suivant est nécessaire.
P.S. : Avant que ma connexion internet ne soit coupée pendant quelques heures, j'avais aussi envie de commenter le fait étrange que vos générateurs continuent de se renvoyer des références via yield return
.Pour être honnête, cela n'a pas vraiment de sens pour moi ;Je n'ai jamais vu ce genre de code et je me demande s'il fait réellement quelque chose d'utile ?