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:

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 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. 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.

Zobacz też