Yield — Instrukcja (Visual Basic)
Wysyła następny element kolekcji do For Each...Next
instrukcji .
Składnia
Yield expression
Parametry
Termin | Definicja |
---|---|
expression |
Wymagany. Wyrażenie niejawnie konwertowane na typ funkcji iteratora lub Get metody dostępu zawierającej instrukcję Yield . |
Uwagi
Instrukcja Yield
zwraca jeden element kolekcji jednocześnie. Instrukcja Yield
jest zawarta w funkcji iteratora lub Get
metod dostępu, które wykonują niestandardowe iteracji w kolekcji.
Używasz funkcji iteratora przy użyciu funkcji dla każdego... Następna instrukcja lub zapytanie LINQ. Każda iteracja For Each
pętli wywołuje funkcję iteratora. Po Yield
osiągnięciu instrukcji w funkcji expression
iteratora zwracana jest bieżąca lokalizacja w kodzie. Wykonanie jest uruchamiane ponownie z tej lokalizacji przy następnym wywołaniu funkcji iteratora.
Niejawna konwersja musi istnieć z typu expression
instrukcji Yield
do zwracanego typu iteratora.
Możesz użyć instrukcji Exit Function
or Return
, aby zakończyć iterację.
"Yield" nie jest słowem zastrzeżonym i ma specjalne znaczenie tylko wtedy, gdy jest używany w Iterator
funkcji lub Get
metod dostępu.
Aby uzyskać więcej informacji na temat funkcji iteracyjnych i Get
metod dostępu, zobacz Iteratory.
Funkcje iteracyjne i uzyskiwanie dostępu
Deklaracja funkcji iteratora lub Get
metody dostępu musi spełniać następujące wymagania:
Musi zawierać modyfikator iteratora .
Zwracany typ musi mieć IEnumerablewartość , , IEnumerable<T>IEnumeratorlub IEnumerator<T>.
Nie może mieć żadnych
ByRef
parametrów.
Funkcja iteratora nie może wystąpić w zdarzeniu, konstruktorze wystąpienia, konstruktorze statycznym lub destruktorze statycznym.
Funkcja iteratora może być funkcją anonimową. Aby uzyskać więcej informacji, zobacz Iteratory.
Obsługa wyjątków
Instrukcja Yield
może znajdować się wewnątrz Try
bloku try... Złapać... Finally, instrukcja. Blok Try
zawierający instrukcję Yield
może zawierać Catch
bloki i może mieć Finally
blok.
Instrukcja Yield
nie może znajdować się wewnątrz Catch
bloku lub Finally
bloku.
For Each
Jeśli treść (poza funkcją iteratora) zgłasza wyjątek, Catch
blok w funkcji iteratora nie jest wykonywany, ale Finally
jest wykonywany blok w funkcji iteratora. Blok Catch
wewnątrz funkcji iteratora przechwytuje tylko wyjątki występujące wewnątrz funkcji iteratora.
Realizacja techniczna
Poniższy kod zwraca element IEnumerable (Of String)
z funkcji iteratora, a następnie iteruje przez elementy elementu IEnumerable (Of String)
.
Dim elements As IEnumerable(Of String) = MyIteratorFunction()
…
For Each element As String In elements
Next
Wywołanie polecenia MyIteratorFunction
nie wykonuje treści funkcji. Zamiast tego wywołanie zwraca element IEnumerable(Of String)
do zmiennej elements
.
W iteracji For Each
pętli metoda jest wywoływana MoveNext dla elements
metody . To wywołanie wykonuje treść do MyIteratorFunction
momentu osiągnięcia następnej Yield
instrukcji. Instrukcja Yield
zwraca wyrażenie, które określa nie tylko wartość element
zmiennej do użycia przez treść pętli, ale także Current właściwość elementów, czyli IEnumerable (Of String)
.
W każdej kolejnej For Each
iteracji pętli wykonanie treści iteratora będzie kontynuowane od miejsca, w którym zostało przerwane, ponownie zatrzymując się po osiągnięciu Yield
instrukcji. Pętla For Each
kończy się po osiągnięciu końca funkcji iteratora Return
lub instrukcji or Exit Function
.
Przykład 1
Poniższy przykład zawiera instrukcję Yield
, która znajduje się wewnątrz elementu For... Następna pętla. Każda iteracja treści instrukcji For Each w Main
obiekcie tworzy wywołanie funkcji iteratora Power
. Każde wywołanie funkcji iteratora przechodzi do następnego wykonania Yield
instrukcji, która występuje podczas następnej For…Next
iteracji pętli.
Zwracany typ metody iteratora to IEnumerable<T>, typ interfejsu iteratora. Kiedy metoda iteratora jest wywoływana, zwraca obiekt wyliczeniowy, który zawiera potęgi liczb.
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
Przykład 2
W poniższym przykładzie pokazano metodę Get
dostępu, która jest iteratorem. Deklaracja właściwości zawiera Iterator
modyfikator.
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
Aby uzyskać dodatkowe przykłady, zobacz Iteratory.