Yield – příkaz (Visual Basic)

Odešle další prvek kolekce do For Each...Next příkazu.

Syntaxe

Yield expression  

Parametry

Pojem definice
expression Povinný: Výraz, který je implicitně konvertibilní na typ funkce iterátoru nebo Get přístupového objektu Yield , který obsahuje příkaz.

Poznámky

Příkaz Yield vrátí jeden prvek kolekce najednou. Příkaz Yield je součástí funkce iterátoru nebo Get přístupového objektu, který provádí vlastní iterace v kolekci.

Funkci iterátoru využíváte pomocí funkce For Each... Další příkaz nebo dotaz LINQ Každá iterace smyčky For Each volá funkci iterátoru. Yield Při dosažení příkazu ve funkci expression iterátoru se vrátí aktuální umístění v kódu. Provádění je restartováno ze zmíněného umístění pokaždé, když je zavolána funkce iterátoru.

Implicitní převod musí existovat z typu expression příkazu Yield na návratový typ iterátoru.

K ukončení iterace můžete použít příkaz Exit Function nebo Return příkaz.

"Yield" není rezervované slovo a má zvláštní význam pouze v případech, kdy se používá ve funkci nebo Get přístupovém objektuIterator.

Další informace o funkcích a Get přístupových objektech iterátoru najdete v tématu Iterátory.

Funkce iterátoru a získání přístupových objektů

Deklarace funkce iterátoru nebo Get přístupového objektu musí splňovat následující požadavky:

Funkce iterátoru nemůže nastat v události, konstruktoru instance, statickém konstruktoru nebo statickém destruktoru.

Iterátorovou funkcí může být anonymní funkce. Další informace najdete v tématu Iterátory.

Zpracování výjimek

Příkaz Yield může být uvnitř Try bloku try... Chytit... Příkaz Finally. Try Blok, který obsahuje Yield příkaz, může obsahovat Catch bloky a může obsahovat Finally blok.

Příkaz Yield nemůže být uvnitř Catch bloku nebo Finally bloku.

For Each Pokud tělo (mimo funkci iterátoru) vyvolá výjimku, Catch nespustí se blok ve funkci iterátoru, ale Finally spustí se blok ve funkci iterátoru. Blok Catch uvnitř funkce iterátoru zachytává pouze výjimky, ke kterým dochází uvnitř funkce iterátoru.

Technická implementace

Následující kód vrátí funkci IEnumerable (Of String) iterátoru a pak iteruje prvky objektu IEnumerable (Of String).

Dim elements As IEnumerable(Of String) = MyIteratorFunction()  
    …  
For Each element As String In elements  
Next  

Volání MyIteratorFunction nespustí tělo funkce. Místo toho volání vrátí IEnumerable(Of String) do elements proměnné.

Při iteraci smyčky For EachMoveNext je volána elementsmetoda . Toto volání provede text MyIteratorFunction až do dosažení dalšího Yield příkazu. Příkaz Yield vrátí výraz, který určuje nejen hodnotu element proměnné pro spotřebu tělem smyčky, ale také Current vlastnost prvků, což je IEnumerable (Of String).

Při každé následné iteraci For Each smyčky pokračuje spuštění těla iterátoru tam, kde skončil, a znovu se zastaví, když dosáhne Yield příkazu. Smyčka For Each se dokončí po dosažení konce funkce iterátoru nebo Return příkazu.Exit Function

Příklad 1

Následující příklad obsahuje Yield příkaz, který je uvnitř for ... Další smyčka. Každá iterace textu příkazu For Each vytvoří Main volání funkce iterátoru Power . Každé volání funkce iterátoru pokračuje k dalšímu spuštění Yield příkazu, ke kterému dochází během další iterace smyčky For…Next .

Návratový typ metody iterátoru je IEnumerable<T>, typ rozhraní iterátoru. Při volání metody iterátoru je vrácen vyčíslitelný objekt, který obsahuje mocniny čísla.

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

Příklad 2

Následující příklad ukazuje Get přístup, který je iterátor. Deklarace vlastnosti obsahuje Iterator modifikátor.

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

Další příklady najdete v tématu Iterátory.

Viz také