Delen via


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:

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.

Zie ook