Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Wysyła następny element kolekcji do For Each...Next instrukcji .
Składnia
Yield expression
Parametry
| Termin | Definicja |
|---|---|
expression |
To jest wymagane. 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
ByRefparametró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... Ł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.
Implementacja 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 elementsmetody . 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. Gdy metoda iteratora jest wywoływana, zwraca obiekt wyliczalny zawierający moce liczby.
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.