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:
Musí zahrnovat iterátor modifikátor.
The return type must be IEnumerable, IEnumerable<T>, IEnumerator, or IEnumerator<T>.
Nemůže obsahovat ani ByRef parametry.
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