Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Skickar nästa element i en samling till en For Each...Next -instruktion.
Syntax
Yield expression
Parameterar
| Begrepp | Definition |
|---|---|
expression |
Obligatoriskt. Ett uttryck som implicit kan konverteras till den typ av iteratorfunktion eller Get -accessor som innehåller -instruktionen Yield . |
Anmärkningar
-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- eller Return-instruktion för 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
ByRefparametrar.
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 EachMoveNext 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.