Freigeben über


Yield-Anweisung (Visual Basic)

Sendet das folgende Element einer Auflistung einer For Each...Next-Anweisung.

Yield expression

Parameter

Begriff

Definition

expression

Erforderlich. Ein Ausdruck, der dem Typ der Iteratorfunktion oder des Get Accessor implizit in ist, der die Yield-Anweisung enthält.

Hinweise

Die Yield-Anweisung ist ein Element einer Auflistung auf einmal zurück. Die Yield-Anweisung wird in einer Iteratorfunktion oder in einem Get Accessor enthalten, die benutzerdefinierte Iterationen zu einer Auflistung ausführen.

Sie verwenden eine Iteratorfunktion, indem Sie For Each...Next-Anweisung (Visual Basic) oder eine LINQ-Abfrage verwenden. Jede Iteration der Schleife For Each ruft die Iteratorfunktion auf. Wenn eine Yield-Anweisung in der Iteratorfunktion erreicht ist, wird expression zurückgegeben, und die aktuelle Position im Code wird beibehalten. Die Ausführung von diesem Speicherort beim nächsten Mal neu gestartet, dass die Iteratorfunktion aufgerufen wird.

Eine implizite Konvertierung muss vom Typ von expression in der Yield-Anweisung an den Rückgabetyp des Iterators vorhanden sind.

Sie können eine Exit Function oder Return-Anweisung verwenden, um die Iteration zu beenden.

"Yield" ist kein reserviertes Wort und ist eine besondere Bedeutung, falls dies in einer Iterator-Funktion oder in einem Get Accessor verwendet wird.

Weitere Informationen zu Iteratorfunktionen und Get Accessoren, finden Sie unter Iteratoren (C# und Visual Basic).

Iterator-Funktionen und get-Accessoren

Die Deklaration einer Iteratorfunktion oder des Get Accessor muss die folgenden Anforderungen erfüllen:

Eine Iteratorfunktion kann nicht in einem Ereignis, in einem Instanzenkonstruktor, in einem statischen Konstruktor oder in einem statischen Destruktor auftreten.

Eine Iteratorfunktion können anonyme Funktion sein. Weitere Informationen finden Sie unter Iteratoren (C# und Visual Basic).

Ausnahmebehandlung

Eine Yield-Anweisung kann innerhalb eines Blocks von TryTry...Catch...Finally-Anweisung (Visual Basic) sein. Ein Try-Block, der eine Yield-Anweisung hat, kann Catch Blöcke haben und kann einen Finally-Block haben.

Eine Yield-Anweisung kann nicht innerhalb eines Catch-Blocks oder eines - Blocks Finally sein.

Wenn der For Each Text (außerhalb der Iteratorfunktion) eine Ausnahme auslöst, wird ein Catch-Block in der Iteratorfunktion nicht ausgeführt, aber ein Finally-Block in der Iteratorfunktion wird ausgeführt. Ein Catch-Block in einer Iteratorfunktion fängt nur Ausnahmen ab, die in der Iteratorfunktion auftreten.

Technische Implementierung

Der folgende Code gibt IEnumerable (Of String) aus einer Iteratorfunktion zurück und durchläuft dann durch die Elemente IEnumerable (Of String) durch.

Dim elements As IEnumerable(Of String) = MyIteratorFunction()
    …
For Each element As String In elements
Next

Der Aufruf MyIteratorFunction führt nicht den Text der Funktion aus. Stattdessen beim Aufruf IEnumerable(Of String) in die elements-Variable.

Auf einer Iteration der Schleife For Each, wird die MoveNext-Methode für elements aufgerufen. Dieser Aufruf wird der Text von MyIteratorFunction aus, bis die folgende Anweisung Yield erreicht ist. Die Yield-Anweisung gibt einen Ausdruck zurück, der nicht nur den Wert der element-Variable für die Konsumierung durch den Schleifentext jedoch auch die Current-Eigenschaft von Elementen bestimmt, die IEnumerable (Of String) ist.

Klicken Sie in der nächsten Iteration For Each-Schleife, setzt die Ausführung des Iteratortexts der, in denen diese durch unterzogen fort und erneut angehalten wird, wenn sie eine Yield-Anweisung erreicht. Die For Each-Schleife werden abgeschlossen, wenn das Ende der Iteratorfunktion oder der Return oder Exit Function-Anweisung erreicht wird.

Beispiel

Das folgende Beispiel enthält eine Yield-Anweisung, die innerhalb einer Für... Next-Schleife Schleife ist. Jede Iteration des For Each-Anweisungstexts in Main erstellt einen Aufruf der Power Iteratorfunktion. Jeder Aufruf der Iteratorfunktion wechselt zur nächsten Ausführung der Yield-Anweisung über, die während der nächsten Iteration der Schleife For…Next auftritt.

Der Rückgabetyp der Iteratormethode ist IEnumerable, ein Iteratorschnittstellentyp. Wenn die Iteratormethode aufgerufen wird, gibt sie ein aufzählbares Objekt zurück, das die Potenzen einer Zahl enthält.

Sub Main()
    For Each number In Power(2, 8)
        Console.Write(number & " ")
    Next 
    ' Output: 2 4 8 16 32 64 128 256
    Console.ReadKey()
End Sub 

Private Iterator Function Power(
ByVal base As Integer, ByVal highExponent As Integer) _
As System.Collections.Generic.IEnumerable(Of Integer)

    Dim result = 1

    For counter = 1 To highExponent
        result = result * base
        Yield result
    Next 
End Function

Im folgenden Beispiel wird ein Get Accessor, der ein Iterator ist. Die Eigenschaftendeklaration umfasst einen Iterator-Modifizierer.

Sub Main()
    Dim theGalaxies As New Galaxies
    For Each theGalaxy In theGalaxies.NextGalaxy
        With theGalaxy
            Console.WriteLine(.Name & "  " & .MegaLightYears)
        End With 
    Next
    Console.ReadKey()
End Sub 

Public Class Galaxies
    Public ReadOnly Iterator Property NextGalaxy _
    As System.Collections.Generic.IEnumerable(Of Galaxy)
        Get
            Yield New Galaxy With {.Name = "Tadpole", .MegaLightYears = 400}
            Yield New Galaxy With {.Name = "Pinwheel", .MegaLightYears = 25}
            Yield New Galaxy With {.Name = "Milky Way", .MegaLightYears = 0}
            Yield New Galaxy With {.Name = "Andromeda", .MegaLightYears = 3}
        End Get 
    End Property 
End Class 

Public Class Galaxy
    Public Property Name As String 
    Public Property MegaLightYears As Integer 
End Class

Weitere Beispiele finden Sie unter Iteratoren (C# und Visual Basic).

Anforderungen

Visual Studio 2012

Siehe auch

Weitere Ressourcen

Iteratoren (C# und Visual Basic)

Anweisungen (Visual Basic)