Sdílet prostřednictvím


Příkaz yield (Visual Basic)

Odešle na další prvek kolekce, chcete-li For Each...Next prohlášení.

Yield expression

Parametry

Termín

Definice

expression

Povinné.Výraz, který je implicitně převést na typ funkce iterační nebo Get přistupující objekt, který obsahuje Yield prohlášení.

Poznámky

Yield Příkaz vrátí jeden prvek kolekce najednou.Yield Prohlášení je součástí funkce jazyka iterátor nebo Get přistupujícím objektu provést vlastní iterací v kolekci.

Využívat funkce aplikace iterátor pomocí Pro každý...Další příkaz (Visual Basic) nebo dotazu LINQ.Každém opakování For Each smyčka volá funkci iterátoru.Při Yield prohlášení je dosaženo ve funkci iterátor expression je vrácena, a zůstane zachováno aktuální umístění v kódu.Spuštění z tohoto umístění restartován při příštím iterační funkce je volána.

Implicitní převod musí existovat z typu expression v Yield příkaz návratový typ iterace.

Můžete použít Exit Function nebo Return příkaz iterace.

"Výnos" je vyhrazené slovo a má zvláštní význam pouze v případě, že je používán Iterator funkce nebo Get přistupujícího objektu.

Další informace o funkcích iterátor a Get přístupové objekty, viz U iterátorů (C# a Visual Basic).

Funkce iterační a přístupové objekty Get

Deklarace funkce iterační nebo Get přistupující objekt musí splňovat následující požadavky:

Funkce jazyka iterátor nelze provést v události, konstruktor instance, statického konstruktoru nebo statické destruktor.

Funkce jazyka iterace může být anonymní funkce.Další informace naleznete v tématu U iterátorů (C# a Visual Basic).

Zpracování výjimek

A Yield příkaz může být uvnitř Try blokovat z Zkuste...Úlovek...Nakonec prohlášení (Visual Basic).A Try blok, který má Yield příkaz může mít Catch blokuje a může mít Finally bloku.

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

Pokud For Each subjektu (mimo funkci iterátor) vyvolá výjimku, Catch blok ve funkci iterátor není spuštěn, ale Finally blok ve funkci iterátor je proveden.A Catch bloku funkce jazyka iterátor zachytí pouze výjimky, ke kterým dochází uvnitř funkce iterační.

Technická implementace

Následující kód vrátí IEnumerable (Of String) z funkce jazyka iterátor a pak prochází prvky IEnumerable (Of String).

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

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

Na iterace For Each smyčky, MoveNext metoda je volána pro elements.Toto volání provede těla MyIteratorFunction až do dalšího Yield prohlášení, je dosaženo.Yield Příkaz vrací výraz, který určuje nejen hodnotu element proměnné určené ke spotřebě smyčky jejíž tělo, ale také Current vlastnosti prvků, která je IEnumerable (Of String).

Při každé následné opakování For Each smyčka, pokračuje spuštění iterátor subjektu, odkud byl přerušen, opět zastaven při dosažení Yield prohlášení.For Each Po dokončení smyčky na konec funkce iterační nebo Return nebo Exit Function prohlášení, je dosaženo.

Příklad

V následujícím příkladu má Yield příkaz, který je uvnitř pro...Další smyčky.Každém opakování pro každou prohlášení subjektu v Main vytvoří volání Power iterační funkce.Každé volání funkce iterační pokračuje další provádění Yield příkaz, který nastane při dalším opakování For…Next smyčky.

Návratový typ metody iterace je IEnumerable<T>, typ rozhraní iterator.Při volání metody iterace vrátí vyčíslitelné objekt, který obsahuje pravomoci číslo.

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

Následující příklad ukazuje Get přistupující objekt, který je iterátor.Obsahuje deklaraci vlastnosti 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 U iterátorů (C# a Visual Basic).

Požadavky

Visual Studio 2012

Viz také

Další zdroje

U iterátorů (C# a Visual Basic)

Příkazy (Visual Basic)