Udostępnij za pośrednictwem


Instrukcja yield (Visual Basic)

Wysyła następnego elementu kolekcji do For Each...Next instrukcji.

Yield expression

Parametry

Termin

Definicja

expression

Wymagane.Wyrażenie, które jest niejawnie konwertowane typ funkcja sterująca lub Get akcesora, który zawiera Yield instrukcji.

Uwagi

Yield Instrukcja zwraca jeden z elementów kolekcji na raz.Yield Instrukcja znajduje się w funkcja sterująca lub Get akcesora, który wykonywał niestandardowe iteracji na zbiorze.

Zużywają występuje funkcja sterująca za pomocą Dla każdego...Następna instrukcja (Visual Basic) lub zapytanie LINQ.Każda iteracja For Each pętli wywołuje funkcja sterująca.Gdy Yield instrukcja zostanie osiągnięta w funkcja sterująca expression jest zwracana i bieżącej lokalizacji w kodzie jest zachowywana.Wykonanie jest uruchamiany ponownie z tej lokalizacji w następnym razem, która jest wywoływana funkcja sterująca.

Niejawna konwersja musi istnieć od rodzaju expression w Yield instrukcję, aby zwracany typ sterująca.

Można użyć Exit Function lub Return instrukcję, aby zakończyć iterację.

"Plon" nie jest słowem zarezerwowanym i ma specjalne znaczenie tylko wtedy, gdy jest on używany w Iterator funkcja lub Get metoda dostępu.

Aby uzyskać więcej informacji na temat funkcji sterująca i Get metod dostępu, zobacz Iteratory (C# i Visual Basic).

Funkcje sterująca i akcesor Get

Deklaracja funkcja sterująca lub Get akcesora muszą spełniać następujące wymagania:

Funkcja sterująca nie może występować w zdarzeń, konstruktor wystąpień, konstruktorze statycznym lub statyczne destruktor.

Funkcja sterująca może być funkcją anonimową.Aby uzyskać więcej informacji, zobacz Iteratory (C# i Visual Basic).

Obsługa wyjątków

A Yield instrukcja może być wewnątrz Try blok z Spróbuj...Catch...Instrukcja finally (Visual Basic).A Try bloku, który Yield instrukcja może mieć Catch bloków i może mieć Finally bloku.

A Yield instrukcja nie może znajdować się wewnątrz Catch bloku lub Finally bloku.

Jeśli For Each ciała (poza funkcja sterująca) zgłasza wyjątek, Catch blok w funkcji sterująca nie jest wykonywana, ale Finally wykonaniu bloku w funkcja sterująca.A Catch blok wewnątrz jest funkcja sterująca połowy tylko wyjątki, które występują wewnątrz funkcja sterująca.

Techniczna realizacja

Następujący kod dodaje zwraca IEnumerable (Of String) z funkcji sterująca i iteruje ją przez elementy IEnumerable (Of String).

Dim elements As IEnumerable(Of String) = MyIteratorFunction()
    …
For Each element As String In elements
Next

Wywołanie MyIteratorFunction treści funkcja nie jest wykonywana.Zamiast tego wywołanie zwraca IEnumerable(Of String) do elements zmiennej.

Na powtórzenie For Each pętli, MoveNext dla wywoływana jest metoda elements.To wywołanie wykonuje treści MyIteratorFunction aż do następnego Yield instrukcja zostanie osiągnięty.Yield Instrukcja zwraca wyrażenie, które określa nie tylko wartość element zmiennej do spożycia przez organ pętli, ale również Current właściwości elementów, która jest IEnumerable (Of String).

Przy poszczególnych iteracjach kolejnych For Each w pętli, kontynuuje wykonywanie ciała sterująca z, w którym zostało przerwane, zatrzymując się ponownie po osiągnięciu Yield instrukcji.For Each Pętla kończy, gdy koniec funkcja sterująca lub Return lub Exit Function instrukcja zostanie osiągnięty.

Przykład

Poniższy przykład ma Yield instrukcji, która znajduje się wewnątrz dla...Następny pętli.Każda iteracja dla każdego treść instrukcji w Main tworzy wywołanie Power funkcja sterująca.Każde wywołanie funkcji sterująca przechodzi do następnej wykonanie Yield instrukcję, która pojawia się podczas następnej iteracji For…Next pętli.

Zwracany typ metody iteratora jest IEnumerable<T>, typ interfejsu sterująca.Gdy wywoływana jest metoda sterująca, zwraca agreguje ustalony obiekt, który zawiera uprawnień 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

W poniższym przykładzie zademonstrowano Get akcesora, który jest iterację.Deklaracja właściwość 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 (C# i Visual Basic).

Wymagania

Visual Studio 2012

Zobacz też

Inne zasoby

Iteratory (C# i Visual Basic)

Instrukcje (Visual Basic)