Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Sendet das nächste Element einer Auflistung an eine For Each...Next Anweisung.
Syntax
Yield expression
Die Parameter
| Begriff | Definition |
|---|---|
expression |
Erforderlich. Ein Ausdruck, der implizit in den Typ der Iteratorfunktion oder Get des Accessors, der die Yield Anweisung enthält, konvertierbar ist. |
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... Next-Anweisung oder LINQ-Abfrage. Jede Iteration der For Each Schleife ruft die Iteratorfunktion auf. Wenn eine Yield Anweisung in der Iteratorfunktion erreicht wird, expression wird sie zurückgegeben, und die aktuelle Position im Code wird beibehalten. Die Ausführung wird von diesem Speicherort neu gestartet, wenn die Iteratorfunktion das nächste Mal aufgerufen wird.
Eine implizite Konvertierung muss vom Typ der expressionYield Anweisung in den Rückgabetyp des Iterators vorhanden sein.
Sie können eine Exit Function- oder eine Return-Anweisung verwenden, um die Iteration zu beenden.
"Ertrag" ist kein reserviertes Wort und hat nur dann eine besondere Bedeutung, wenn es in einer Iterator Funktion oder Get einem Accessor verwendet wird.
Weitere Informationen zu Iteratorfunktionen und Get Accessoren finden Sie unter Iteratoren.
Iteratorfunktionen und Accessoren abrufen
Die Deklaration einer Iteratorfunktion oder Get eines Accessors muss die folgenden Anforderungen erfüllen:
Er muss einen Iteratormodifizierer enthalten.
Der Rückgabetyp muss , IEnumerable, IEnumerable<T>, IEnumeratoroder IEnumerator<T>.
Es können keine Parameter vorhanden sein
ByRef.
Eine Iteratorfunktion kann nicht in einem Ereignis, Instanzkonstruktor, statischen Konstruktor oder statischen Destruktor auftreten.
Eine Iteratorfunktion kann eine anonyme Funktion sein. Weitere Informationen finden Sie unter Iteratoren.
Ausnahmebehandlung
Eine Yield Anweisung kann sich innerhalb eines Try Blocks eines Try... Fangen... Abschließende Anweisung. Ein Try Block, der eine Yield Anweisung enthält, kann Catch Blöcke und einen Finally Block aufweisen.
Eine Yield Anweisung kann sich nicht innerhalb eines Catch Blocks oder eines Finally Blocks befinden.
Wenn der For Each Textkörper (außerhalb der Iteratorfunktion) eine Ausnahme auslöst, wird kein Catch Block in der Iteratorfunktion ausgeführt, aber ein Finally Block in der Iteratorfunktion wird ausgeführt. Ein Catch Block innerhalb einer Iteratorfunktion fängt nur Ausnahmen ab, die innerhalb der Iteratorfunktion auftreten.
Technische Implementierung
Der folgende Code gibt eine IEnumerable (Of String) Iteratorfunktion zurück und durchläuft dann die Elemente der IEnumerable (Of String).
Dim elements As IEnumerable(Of String) = MyIteratorFunction()
…
For Each element As String In elements
Next
Der Aufruf, um MyIteratorFunction den Textkörper der Funktion nicht auszuführen. Stattdessen gibt der Aufruf eine IEnumerable(Of String) in die elements Variable zurück.
Bei einer Iteration der For Each Schleife wird die MoveNext Methode aufgerufen elements. Dieser Aufruf führt den Textkörper aus MyIteratorFunction , bis die nächste Yield Anweisung erreicht ist. Die Yield Anweisung gibt einen Ausdruck zurück, der nicht nur den Wert der element Variablen für die Verwendung durch den Schleifentext bestimmt, sondern auch die Current Eigenschaft von Elementen, die ein IEnumerable (Of String).
Bei jeder nachfolgenden Iteration der For Each Schleife wird die Ausführung des Iteratortexts von der Stelle fortgesetzt, an der sie unterbrochen wurde, und wird beim Erreichen einer Yield Anweisung erneut beendet. Die For Each Schleife wird abgeschlossen, wenn das Ende der Iteratorfunktion oder eine oder Exit Function eine Return Anweisung erreicht ist.
Beispiel 1
Das folgende Beispiel weist eine Yield Anweisung auf, die sich in einem For befindet... Nächste Schleife. Jede Iteration des Textkörpers der For Each-AnweisungMain erstellt einen Aufruf der Power Iteratorfunktion. Jeder Aufruf der Iteratorfunktion fährt mit der nächsten Ausführung der Yield Anweisung fort, die während der nächsten Iteration der For…Next Schleife auftritt.
Der Rückgabetyp der Iteratormethode ist IEnumerable<T>ein Iterator-Schnittstellentyp. 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
Beispiel 2
Im folgenden Beispiel wird ein Get Accessor veranschaulicht, der ein Iterator ist. Die Eigenschaftendeklaration 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 Iterators.