Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Odešle další prvek kolekce do For Each...Next příkazu.
Syntaxe
Yield expression
Parametry
| termín | 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. Spuštění se restartuje z daného umístění při příštím volání 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é
ByRefparametry.
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. Když je volána metoda iterátoru, vrátí výčtový 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.