2010-07-20 19 views
-1

UPD. Bonjour, Je sais comment le code ci-dessous fonctionne. Je sais que cross, et circle pointent vers la méthode Cross(), et Circle(). Mais je remplis encore peu de confusion avec cette partie du code. Pouvez-vous l'expliquer pour moi?Fonctionnement de cette partie du code

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; 
       } 
      } 
     } 
+4

[* Ceci est la morue] (http://dictionary.reference.com/browse/cod) - Désolé, n'a pas pu résister. :-) – stakx

+0

Vous avez des parenthèses inégalées, avez-vous du code manquant? De plus, vous semblez manquer votre e-code? –

+4

@stakx: Et la "morue" de l'OP me semble bien poisseuse;) –

Répondre

1

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 pouvez écrire:

foreach (var cross in Cross()) // works with Circle, also 
{ 
    // ... 
} 

Et à chaque itération de la boucle, l'élément suivant à restituer est générée à l'intérieur de la méthode Cross ou Circle. Ces méthodes n'exécutent pas toutes à la fois, chaque fois qu'une instruction yield return est atteinte, l'exécution du programme se poursuit dans le code appelant (la boucle foreach) et le code dans le générateur n'est repris que lorsque l'élément suivant est requis.


P.S .: Avant ma connexion Internet est tombé en panne pendant quelques heures, je voulais aussi faire des commentaires sur le fait étrange que vos générateurs revient sans cesse les références à eux-mêmes par l'intermédiaire yield return. Cela n'a pas vraiment de sens pour moi, pour être honnête; Je n'ai jamais vu ce genre de code et je me demande s'il fait vraiment quelque chose d'utile?

+0

Ce code est un exemple de livre. C'est illustrer comment le rendement de l'opérateur fonctionne. Mais pour une raison quelconque, cela me rend confus. C'est pourquoi j'ai posé ma question. – Sergii

+0

Si cela provient d'un manuel, et que les autres exemples de code sont comme ça, vous devriez envisager de vous débarrasser du livre. Il n'est pas difficile de trouver de meilleurs exemples de «rendement du rendement» et de «rupture de rendement». Voici un exemple très simple: ** (1) ** Définir un itérateur: 'IEnumerable Range (int de, int à) {for (int i = de; i stakx