Yield – příkaz (Visual Basic)

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

Syntaxe

Yield expression  

Parametry

Pojem Definice
expression Povinná hodnota. Výraz, který lze implicitně převést na typ funkce iterátoru nebo Get přistupující objekt, který obsahuje Yield příkaz.

Poznámky

YieldPříkaz vrátí jeden prvek kolekce v čase. YieldPříkaz je obsažen ve funkci iterátoru nebo Get přistupující objekt, který provádí vlastní iterace v kolekci.

Využijete funkci iterátoru pro každý z nich... Další příkaz nebo dotaz LINQ. Každá iterace For Each smyčky volá funkci iterátoru. Je-li Yield ve funkci iterátoru dosaženo příkazu, expression je vráceno a aktuální umístění v kódu je uchováno. 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 expression v typu v Yield příkazu na návratový typ iterátoru.

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

"Yield" není rezervované slovo a má zvláštní význam pouze v případě, že je použit ve Iterator funkci nebo Get přistupující objekt.

Další informace o funkcích iterátoru a Get přístupových objektů naleznete v tématu iterátory.

Funkce iterátoru a přistupující objekty get

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

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

Funkce iterátoru může být anonymní funkce. Další informace najdete v tématu iterátory.

Zpracování výjimek

YieldPříkaz může být uvnitř Try bloku Try... Zachytit... Finally – příkaz. TryBlok, který má Yield příkaz, může mít Catch bloky a může mít Finally blok.

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

Pokud For Each tělo (mimo funkci iterátoru) vyvolá výjimku, není Catch proveden blok ve funkci iterátoru, ale Finally je proveden blok ve funkci iterátoru. CatchBlok uvnitř funkce iterátoru zachytává pouze výjimky, ke kterým dojde uvnitř funkce iterátoru.

Technická implementace

Následující kód vrátí IEnumerable (Of String) z funkce iterátoru a poté provede iteraci 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é.

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

Při každém následném opakování For Each smyčky pokračuje provádění textu iterátoru z místa, kde bylo ponecháno, opětovné zastavení při dosažení Yield příkazu. For EachSmyčka skončí po dosažení konce funkce iterátoru nebo Return Exit Function příkazu or.

Příklad 1

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

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řistupující objekt, který je iterátorem. 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 naleznete v tématu iterátory.

Viz také