Yield-Anweisung (Visual Basic)
Sendet das nächste Element einer Auflistung an eine For Each...Next
Anweisung.
Syntax
Yield expression
Parameter
Begriff | Definition |
---|---|
expression |
Erforderlich. Ein Ausdruck, der implizit in den Typ der Iteratorfunktion oder Get des Accessors konvertiert wird, der die Yield -Anweisung enthält. |
Bemerkungen
Die Yield
-Anweisung gibt jeweils ein Element einer Auflistung zurück. Die Yield
Anweisung ist in einer Iteratorfunktion oder Get
einem Accessor enthalten, die benutzerdefinierte Iterationen über eine Auflistung ausführen.
Sie verwenden eine Iteratorfunktion mithilfe einer For Each... Nächste Anweisung oder eine LINQ-Abfrage. Jede Iteration der For Each
-Schleife ruft die Iteratorfunktion auf. Wenn eine Yield
-Anweisung im Iterator erreicht wird, wird ein expression
-Ausdruck zurückgegeben, und die aktuelle Position im Code wird beibehalten. Wenn die Iteratorfunktion das nächste Mal aufgerufen wird, wird die Ausführung von dieser Position neu gestartet.
Es muss eine implizite Konvertierung vom Typ des expression
in der Yield
-Anweisung in den Rückgabetyp des Iterators vorhanden sein.
Zum Beenden kann eine Exit Function
-Anweisung oder eine Return
-Anweisung verwendet werden.
„Yield“ ist kein reserviertes Wort und hat nur dann eine besondere Bedeutung, wenn es in einer Iterator
-Funktion oder einem Get
-Accessor verwendet wird.
Weitere Informationen zu Iteratorfunktionen und Get
Accessoren finden Sie unter Iteratoren.
Iteratorfunktionen und Get Accessors
Die Deklaration einer Iteratorfunktion oder eines Get
-Accessors muss die folgenden Anforderungen erfüllen:
Es muss einen Iterator-Modifizierer enthalten.
Der Rückgabetyp muss IEnumerable, IEnumerable<T>, IEnumerator oder IEnumerator<T> sein.
Die darf keine
ByRef
-Parameter aufweisen.
Eine Iteratorfunktion kann nicht in einem Ereignis, Instanzenkonstruktor, statischen Konstruktor oder statischen Destruktor vorkommen.
Eine Iteratorfunktion kann eine anonyme Funktion sein. Weitere Informationen finden Sie unter Iteratoren.
Ausnahmebehandlung
Eine Yield
-Anweisung kann sich in einem Try
-Block eines Try... Fangen... Abschließende Anweisung. Ein Try
-Block mit einer Yield
-Anweisung kann über Catch
-Blöcke und über einen Finally
-Block verfügen.
Eine Yield
-Anweisung darf sich nicht in einem Catch
- oder Finally
-Block befinden.
Wenn der For Each
-Text (anstelle der Iteratorfunktion) eine Ausnahme auslöst, wird ein Catch
-Block in der Iteratorfunktion nicht ausgeführt, ein Finally
-Block in der Iteratorfunktion dagegen schon. Ein Catch
-Block in einer Iteratorfunktion fängt nur Ausnahmen ab, die innerhalb der Iteratorfunktion auftreten.
Technische Implementierung
Der folgende Code gibt einen IEnumerable (Of String)
aus einer Iteratormethode zurück und durchläuft dann die Elemente von IEnumerable (Of String)
.
Dim elements As IEnumerable(Of String) = MyIteratorFunction()
…
For Each element As String In elements
Next
Der Aufruf von MyIteratorFunction
führt nicht den Text der Funktion aus. Stattdessen gibt der Aufruf einen IEnumerable(Of String)
in die Variable elements
zurück.
Bei einer Iteration der For Each
-Schleife wird die Methode MoveNext für elements
aufgerufen. Dieser Aufruf führt MyIteratorFunction
aus, bis die nächste Yield
-Anweisung erreicht ist. Der Ausdruck, der durch die Yield
-Anweisung zurückgegeben wird, ermittelt nicht nur den Wert der element
-Variable für die Verwendung im Schleifentext, sondern auch die Current-Eigenschaft der Elemente, die IEnumerable (Of String)
ist.
Bei jeder nachfolgenden Iteration der For Each
-Schleife wird die Ausführung des Iteratortexts da fortgesetzt, wo sie beendet wurde, und endet dann wieder an einer Yield
-Anweisung. Die For Each
-Schleife wird beendet, wenn das Ende der Iteratormethode oder eine Return
- oder Exit Function
-Anweisung erreicht wird.
Beispiel 1
In folgendem Beispiel wird eine Yield
-Anweisung verwendet, die sich innerhalb einer Schleife vom Typ For…Next befindet. Jede Iteration des For Each-Anweisungstexts in Main
erzeugt einen Aufruf an die Power
-Iteratorfunktion. Jeder Aufruf der Iteratorfunktion führt bei der nächsten Iteration der Yield
-Schleife zur nächsten Ausführung der For…Next
-Anweisung.
Der Rückgabetyp der Iteratormethode ist IEnumerable<T>, was ein Iteratorschnittstellentyp ist. Wird 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
Beispiel 2
Das folgende Beispiel zeigt einen Get
-Accessor, der ein Iterator ist. Die Deklaration der Eigenschaft enthält 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.