Ein Methode, mit dem Schlüsselwort
yield return innerhalb, wird vom Compiler intern in eine State-Machine übersetzt, so daß bei jedem Aufruf der Methode der nachfolgende Code (nach dem
yield return) weiter ausgeführt wird. Wichtig dabei ist, daß der Rückgabetyp
IEnumerable<T> ist, so daß eine Folge generiert wird.
Bei statischen Werten würde man z.B. eine List<T> zurückgeben:
C#-Quelltext
1: 2: 3: 4:
| List<int> Test() { return new List<int> { 2, 3, 5, 7, 11, 13, 17, 19 }; } |
Bei der Methode
DividerSequence() wird quasi eine unendliche Liste erzeugt, aber eben mittels "Lazy Evaluation" ausgewertet, d.h. erst wenn wirklich auf die generierte Enumeration zugegriffen wird.
Der Code
C#-Quelltext
1: 2:
| foreach (int x in DividerSequence()) Console.WriteLine(x); |
erzeugt also diese unendliche Liste von Primfaktorkandidaten.
Edit: Durch
yield break oder wenn das Ende der Methode erreicht ist, wird kein weiteres Element der Folge mehr generiert - was meistens benutzt wird, um endliche Folgen (Auflistungen) zu generieren.
Etwas ausführlicher wird es noch unter
Essential .NET: Benutzerdefinierte Iteratoren mit „yield“ sowie
Yield return in C# (auf englisch) erklärt.
PS: Die Schleife mit
+=6 wird genommen, da dies eine Optimierung gegenüber
+=2 (nur ungerade Zahlen ist), da ja alle durch 3 teilbaren ungeraden Zahlen (9, 15, 21, ...) keine Primzahlen sein können.