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:
Musí obsahovat modifikátor iterátoru .
Návratový typ musí být IEnumerable, IEnumerable<T>, IEnumeratornebo IEnumerator<T>.
Nemůže mít žádné
ByRef
parametry.
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 Each
MoveNext je volána elements
metoda . 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.