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:
Musí obsahovat modifikátor iterátoru .
Návratový typ musí být IEnumerable , IEnumerable<T> , IEnumerator nebo IEnumerator<T> .
Nemůže mít žádné
ByRefparametry.
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.