Rendementsinstructie (Visual Basic)
Hiermee wordt het volgende element van een verzameling naar een For Each...Next
instructie verzonden.
Syntaxis
Yield expression
Parameters
Term | Definitie |
---|---|
expression |
Vereist. Een expressie die impliciet kan worden omgezet in het type iterator-functie of Get accessor die de Yield instructie bevat. |
Opmerkingen
De Yield
instructie retourneert één element van een verzameling tegelijk. De Yield
instructie is opgenomen in een iteratorfunctie of Get
accessor, die aangepaste iteraties uitvoert voor een verzameling.
U gebruikt een iterator-functie met behulp van een For Each... Volgende instructie of een LINQ-query. Elke iteratie van de For Each
lus roept de iterator-functie aan. Wanneer een Yield
instructie wordt bereikt in de iterator-functie, expression
wordt deze geretourneerd en blijft de huidige locatie in code behouden. De uitvoering wordt opnieuw gestart vanaf die locatie wanneer de iterator-functie de volgende keer wordt aangeroepen.
Er moet een impliciete conversie bestaan van het type expression
in de Yield
instructie tot het retourtype van de iterator.
U kunt een Exit Function
of-instructie Return
gebruiken om de iteratie te beëindigen.
"Opbrengst" is geen gereserveerd woord en heeft alleen speciale betekenis wanneer deze wordt gebruikt in een Iterator
functie of Get
accessor.
Zie Iterators voor meer informatie over iteratorfuncties en Get
accessors.
Iterator-functies en Get Accessors
De declaratie van een iteratorfunctie of Get
toegangsfunctie moet voldoen aan de volgende vereisten:
Het moet een Iterator-wijzigingsfunctie bevatten.
Het retourtype moet zijnIEnumerable, IEnumerable<T>of IEnumeratorIEnumerator<T>.
Het mag geen
ByRef
parameters hebben.
Een iterator-functie kan niet voorkomen in een gebeurtenis, instantieconstructor, statische constructor of statische destructor.
Een iteratorfunctie kan een anonieme functie zijn. Zie Iterators voor meer informatie.
Afhandeling van uitzonderingen
Een Yield
instructie kan zich in een Try
blok van een Try... Vangen... Tot slot verklaring. Een Try
blok met een Yield
instructie kan blokken bevatten Catch
en kan een Finally
blok hebben.
Een Yield
instructie kan niet binnen een Catch
blok of blok Finally
staan.
Als de For Each
hoofdtekst (buiten de iteratorfunctie) een uitzondering genereert, wordt een Catch
blok in de iterator-functie niet uitgevoerd, maar wordt er een Finally
blok in de iterator-functie uitgevoerd. Een Catch
blok in een iteratorfunctie onderschept alleen uitzonderingen die voorkomen in de iteratorfunctie.
Technische implementatie
De volgende code retourneert een IEnumerable (Of String)
van een iterator-functie en doorloopt vervolgens de elementen van de IEnumerable (Of String)
.
Dim elements As IEnumerable(Of String) = MyIteratorFunction()
…
For Each element As String In elements
Next
De aanroep om de hoofdtekst van de functie niet uit te MyIteratorFunction
voeren. In plaats daarvan retourneert de aanroep een IEnumerable(Of String)
in de elements
variabele.
Bij een herhaling van de For Each
lus wordt de MoveNext methode aangeroepen elements
. Met deze aanroep wordt de hoofdtekst uitgevoerd totdat MyIteratorFunction
de volgende Yield
instructie is bereikt. De Yield
instructie retourneert een expressie die niet alleen de waarde van de element
variabele voor verbruik door de lustekst bepaalt, maar ook de Current eigenschap van elementen, een IEnumerable (Of String)
.
Bij elke volgende iteratie van de For Each
lus gaat de uitvoering van de iterator-hoofdtekst verder vanaf waar deze is gebleven, en stopt opnieuw wanneer er een Yield
instructie wordt bereikt. De For Each
lus wordt voltooid wanneer het einde van de iterator-functie of een Return
of-instructie Exit Function
is bereikt.
Voorbeeld 1
In het volgende voorbeeld ziet u een Yield
instructie die zich in een For bevindt... Volgende lus. Elke iteratie van de hoofdtekst van de instructie For Each maakt Main
een aanroep naar de Power
iterator-functie. Elke aanroep van de iterator-functie gaat verder met de volgende uitvoering van de Yield
instructie, die plaatsvindt tijdens de volgende iteratie van de For…Next
lus.
Het retourtype van de iteratormethode is IEnumerable<T>, een iterator-interfacetype. Wanneer de iteratormethode wordt aangeroepen, wordt een opsommingsobject geretourneerd dat de machten van een getal bevat.
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
Voorbeeld 2
In het volgende voorbeeld ziet u een Get
accessor die een iterator is. De eigenschapsdeclaratie bevat een Iterator
wijzigingsfunctie.
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
Zie Iterators voor meer voorbeelden.