Share via


yield (C#-Referenz)

Das yield-Schlüsselwort signalisiert dem Compiler, dass die Methode, in der es angezeigt wird, ein Iteratorblock ist. Der Compiler generiert eine Klasse, um das Verhalten zu implementieren, das im Iteratorblock ausgedrückt wird. Im Iteratorblock wird das yield-Schlüsselwort mit dem return-Schlüsselwort verwendet, um einen Wert für das Enumeratorobjekt bereitzustellen. Dies ist der Wert, der z. B. in jeder Schleife einer foreach-Anweisung zurückgegeben wird. Das yield-Schlüsselwort wird auch mit break verwendet, um das Ende einer Iteration anzuzeigen. Weitere Informationen zu Iteratoren finden Sie unter Iteratoren (C#-Programmierhandbuch). Im folgenden Beispiel werden die zwei Formen der yield-Anweisung veranschaulicht.

yield return <expression>;
yield break;

Hinweise

In einer yield return-Anweisung wird der expression ausgewertet und als Wert an das Enumeratorobjekt zurückgegeben; der expression muss dabei implizit in den Ausgabetyp des Iterators konvertiert werden können.

In einer yield break-Anweisung wird die Kontrolle ohne Bedingung an den Aufrufer des Iterators zurückgeben. Dabei kann es sich um die IEnumerator.MoveNext-Methode (oder ihre allgemeine Entsprechung System.Collections.Generic.IEnumerable<T>) handeln oder um die Dispose-Methode des Enumeratorobjekts.

Die yield-Anweisung kann nur innerhalb eines iterator-Blocks stehen, der als Rumpf einer Methode, eines Operators oder eines Accessors verwendet werden kann. Der Rumpf solcher Methoden, Operatoren oder Accessoren unterliegt folgenden Einschränkungen:

  • Unsichere Blöcke werden nicht zugelassen.

  • Parameter für die Methode, den Operator oder den Accessor dürfen nicht ref oder out sein.

  • Eine yield return-Anweisung kann nicht in einem try-catch-Block stehen. Die Anweisung kann jedoch in einem try-Block enthalten sein, wenn auf diesen ein finally-Block folgt.

  • Eine yield break-Anweisung kann in einem try- oder einem catch-Block, nicht jedoch in einem finally-Block verwendet werden.

Eine yield-Anweisung darf nicht in einer anonymen Methode stehen. Weitere Informationen finden Sie unter Anonyme Methoden (C#-Programmierhandbuch).

Bei Verwendung mit expression darf eine yield return-Anweisung nicht in einem catch-Block oder einem try-Block stehen, der mehr als eine catch-Klausel enthält. Weitere Informationen finden Sie unter Ausnahmebehandlungsanweisungen (C#-Referenz).

Beispiel

Das folgende Beispiel verwendet die yield-Anweisung innerhalb eines Iteratorblocks, nämlich der Power(int number, int power)-Methode. Wird die Power-Methode aufgerufen, gibt sie ein aufzählbares Objekt zurück, das die Potenzen einer Zahl enthält. Beachten Sie, dass der Rückgabetyp der Power-Methode System.Collections.IEnumerable, ein Iteratorschnittstellentyp, ist.

public class List
{
    //using System.Collections;
    public static IEnumerable Power(int number, int exponent)
    {
        int counter = 0;
        int result = 1;
        while (counter++ < exponent)
        {
            result = result * number;
            yield return result;
        }
    }

    static void Main()
    {
        // Display powers of 2 up to the exponent 8:
        foreach (int i in Power(2, 8))
        {
            Console.Write("{0} ", i);
        }
    }
}
/*
Output:
2 4 8 16 32 64 128 256 
*/

C#-Programmiersprachenspezifikation

Weitere Informationen finden Sie in der C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auch

Referenz

foreach, in (C#-Referenz)

Verwenden von Iteratoren (C#-Programmierhandbuch)

Konzepte

C#-Programmierhandbuch

Weitere Ressourcen

C#-Referenz