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:
Sie muss einen Iterator-Modifizierer einschließen.
Der Rückgabetyp muss IEnumerable, IEnumerable, IEnumerator oder IEnumerator sein.
Es kann keine ByRef-Parameter haben.
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