2009-09-24 8 views
6
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Collections; 

namespace ConsoleApplication4 
{ 
    class Program 
    { 
     static void Main (string[] args) 
     { 
      var test1 = Test1(1, 2); 
      var test2 = Test2(3, 4); 
     } 

     static IEnumerable Test1(int v1, int v2) 
     { 
      yield break; 
     } 

     static IEnumerable Test2 (int v1, int v2) 
     { 
      return new String[] { }; 
     } 
    } 
} 

"test1" scheint IEnumerable mit v1 und v2 (params) als Felder zu sein und "Test1" wird NICHT aufgerufen.Ausbeute Pause; - verrücktes Verhalten

"Test2" arbeitet ein "designed" :)

, was los ist?

Antwort

15

Test1ist genannt, aber es sei denn, Sie durch das Ergebnis durchlaufen, werden Sie nicht einen Haltepunkt auf yield break getroffen.

Grundsätzlich ist Test1 in eine Zustandsmaschine transformiert, die IEnumerable für Sie implementiert ... aber alle den Körper Ihrer Methode ist innerhalb dieser Zustandsmaschine, und es sei denn, Sie MoveNext() die Zustandsmaschine durch GetEnumerator() aufrufen und verwenden Sie dann (oder mit einer foreach Schleife) Sie sehen nicht, dass Ihr Körper ausgeführt wird.

Siehe meine general iterator article und mein iterator implementation Artikel für weitere Informationen, und auch zwei Blog-Beiträge des Eric Lippert: Psychic Debugging part one und Psychic Debugging part two.

1

Da Sie Python erwähnt haben, werde ich darauf hinweisen, dass Generatoren in Python ziemlich ähnlich wie Generatoren in C# arbeiten. Es gibt nur den kleinen Unterschied, dass yield break alleine eine C# -Methode in einen Generator umwandeln kann, während das Python-Äquivalent von raise StopIteration nicht funktioniert.

>>> def f(): 
...  print "Beginning of generator" 
...  if False: yield 
...  print "End of generator" 
... 
>>> it = f() 
>>> it 
<generator object at 0x94fae2c> 
>>> it.next() 
Beginning of generator 
End of generator 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration