Dela via


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:

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.

Se även