Freigeben über


Iteratoren (C#-Programmierhandbuch)

Aktualisiert: November 2007

Bei einem Iterator handelt es sich um eine Methode, einen get-Accessor oder einen Operator, die bzw. der mithilfe des yield-Schlüsselworts eine benutzerdefinierte Iteration für ein Array oder eine Auflistungsklasse ausführt. Durch die yield return-Anweisung wird ein Element in der Quellsequenz unverzüglich an den Aufrufer zurückgegeben, noch bevor auf das nächste Element in der Quellsequenz zugegriffen wird. Obwohl ein Iterator als Methode geschrieben wird, wird sie vom Compiler in eine geschachtelte Klasse übersetzt, die tatsächlich einem Zustandsautomaten entspricht. Die Position des Iterators wird von dieser Klasse so lange verfolgt, wie die foreach-Schleife im Clientcode fortgesetzt wird.

Hinweis:

Welche Compilerabläufe im Hintergrund stattfinden, können Sie mit dem Tool ILDASM.exe feststellen, indem Sie den für eine Iteratormethode generierten IL (Intermediate Language)-Code anzeigen lassen.

Ein Iterator wird von Clientcode mit einer foreach-Anweisung aufgerufen. Beispielsweise können Sie einen Iterator für eine Klasse erstellen, die die Elemente in umgekehrter Reihenfolge zurückgibt bzw. die einen Vorgang für jedes Element ausführt, bevor es vom Iterator zurückgegeben wird. Wenn Sie einen Iterator für eine Klasse oder Struktur erstellen, müssen Sie nicht die gesamte IEnumerator-Schnittstelle implementieren. Wenn der Compiler den Iterator erkennt, generiert er automatisch die Methoden Current, MoveNext und Dispose der IEnumerator-Schnittstelle oder der IEnumerator<T>-Schnittstelle.

Übersicht über Iteratoren

  • Ein Iterator ist ein Codeabschnitt, der eine geordnete Reihe von Werten desselben Typs zurückgibt.

  • Ein Iterator kann als Text einer Methode, eines Operators oder eines get-Accessors verwendet werden.

  • Der Iteratorcode verwendet die yield return-Anweisung, um jedes Element der Reihe nach zurückzugeben. yield break beendet die Iteration.

  • Für eine Klasse können mehrere Iteratoren implementiert werden. Wie alle Klassenmember muss jeder Iterator einen eindeutigen Namen besitzen und kann wie folgt mithilfe von Clientcode in einer foreach-Anweisung aufgerufen werden: foreach(int x in SampleClass.Iterator2){}.

  • Der Rückgabetyp eines Iterators muss IEnumerable, IEnumerator, IEnumerable<T> oder IEnumerator<T> sein.

  • Iteratoren sind die Grundlage für das verzögerte Ausführungsverhalten in LINQ-Abfragen.

Das yield-Schlüsselwort wird zur Angabe des oder der zurückgegebenen Werte verwendet. Bei Erreichen der yield return-Anweisung wird die aktuelle Position gespeichert. Wenn der Iterator das nächste Mal aufgerufen wird, wird die Ausführung von dieser Position neu gestartet.

Iteratoren sind besonders für Auflistungsklassen nützlich, denn sie bieten eine einfache Möglichkeit, komplexe Datenstrukturen, z. B. binäre Strukturen, zu durchlaufen.

Verwandte Abschnitte

Weitere Informationen:

Beispiel

In diesem Beispiel ist die DaysOfTheWeek-Klasse eine einfache Auflistungsklasse, in der die Tage der Woche als Zeichenfolgen gespeichert werden. Nach jeder Iteration einer foreach-Schleife wird die nächste Zeichenfolge in der Auflistung zurückgegeben.

public class DaysOfTheWeek : System.Collections.IEnumerable
{
    string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };

    public System.Collections.IEnumerator GetEnumerator()
    {
        for (int i = 0; i < days.Length; i++)
        {
            yield return days[i];
        }
    }
}

class TestDaysOfTheWeek
{
    static void Main()
    {
        // Create an instance of the collection class
        DaysOfTheWeek week = new DaysOfTheWeek();

        // Iterate with foreach
        foreach (string day in week)
        {
            System.Console.Write(day + " ");
        }
    }
}
// Output: Sun Mon Tue Wed Thr Fri Sat

C#-Programmiersprachenspezifikation

Weitere Informationen finden Sie in den folgenden Abschnitten von C#-Programmiersprachenspezifikation:

  • 10,14 Iteratoren

Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

Generika (C#-Programmierhandbuch)