Yield Statement (Visual Basic)
Skickar nästa element i en samling till en For Each...Next
-instruktion.
Syntax
Yield expression
Parametrar
Period | Definition |
---|---|
expression |
Obligatoriska. Ett uttryck som implicit kan konverteras till den typ av iteratorfunktion eller Get -accessor som innehåller -instruktionen Yield . |
Kommentarer
-instruktionen Yield
returnerar ett element i en samling i taget. -instruktionen Yield
ingår i en iteratorfunktion eller Get
-accessor som utför anpassade iterationer över en samling.
Du använder en iteratorfunktion med hjälp av en För varje... Nästa instruktion eller en LINQ-fråga. Varje iteration av loopen For Each
anropar iteratorfunktionen. När en Yield
instruktion nås i iteratorfunktionen expression
returneras och den aktuella platsen i koden behålls. Körningen startas om från den platsen nästa gång iteratorfunktionen anropas.
En implicit konvertering måste finnas från typen av expression
i -instruktionen Yield
till iteratorns returtyp.
Du kan använda en Exit Function
-instruktion för Return
att avsluta iterationen.
"Yield" är inte ett reserverat ord och har särskild betydelse endast när det används i en Iterator
funktion eller Get
en accessor.
Mer information om iteratorfunktioner och Get
-åtkomstorer finns i Iteratorer.
Iteratorfunktioner och Hämta accessorer
Deklarationen av en iteratorfunktion eller Get
-accessor måste uppfylla följande krav:
Den måste innehålla en Iterator-modifierare .
Returtypen måste vara IEnumerable, IEnumerable<T>, IEnumeratoreller IEnumerator<T>.
Den kan inte ha några
ByRef
parametrar.
En iteratorfunktion kan inte inträffa i en händelse, instanskonstruktor, statisk konstruktor eller statisk destructor.
En iteratorfunktion kan vara en anonym funktion. Mer information finns i Iteratorer.
Undantagshantering
En Yield
instruktion kan finnas i ett Try
block i ett Försök... Fånga... Slutligen -instruktion. Ett Try
block som har en Yield
-instruktion kan ha Catch
block och kan ha ett Finally
block.
En Yield
instruktion får inte finnas i ett Catch
block eller ett Finally
block.
Om brödtexten For Each
(utanför iteratorfunktionen) utlöser ett undantag körs inte ett Catch
block i iteratorfunktionen, men ett Finally
block i iteratorfunktionen körs. Ett Catch
block i en iteratorfunktion fångar bara upp undantag som inträffar i iteratorfunktionen.
Teknisk implementering
Följande kod returnerar en IEnumerable (Of String)
från en iteratorfunktion och itererar sedan genom elementen i IEnumerable (Of String)
.
Dim elements As IEnumerable(Of String) = MyIteratorFunction()
…
For Each element As String In elements
Next
Anropet till MyIteratorFunction
kör inte funktionens brödtext. I stället returnerar anropet en IEnumerable(Of String)
i variabeln elements
.
Vid en iteration av loopen For Each
MoveNext anropas metoden för elements
. Det här anropet kör brödtexten MyIteratorFunction
tills nästa Yield
instruktion har nåtts. -instruktionen Yield
returnerar ett uttryck som inte bara bestämmer värdet för variabeln element
för förbrukning av looptexten Current utan även egenskapen för element, som är en IEnumerable (Of String)
.
På varje efterföljande iteration av loopen For Each
fortsätter körningen av iteratortexten från där den slutade och stoppas igen när den når en Yield
-instruktion. Loopen For Each
slutförs när iteratorfunktionens slut eller en Return
-instruktion Exit Function
nås.
Exempel 1
I följande exempel finns en Yield
instruktion som finns i en For... Nästa loop. Varje iteration av instruktionstexten For Each i Main
skapar ett anrop till Power
iteratorfunktionen. Varje anrop till iteratorfunktionen fortsätter till nästa körning av -instruktionen Yield
, som inträffar under nästa iteration av loopen For…Next
.
Returtypen för iteratormetoden är IEnumerable<T>, en iteratorgränssnittstyp. När iteratormetoden anropas returneras ett uppräkningsbart objekt som innehåller ett tals krafter.
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
Exempel 2
I följande exempel visas en Get
accessor som är en iterator. Egenskapsdeklarationen innehåller en Iterator
modifierare.
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
Ytterligare exempel finns i Iteratorer.