Condividi tramite


Istruzione Yield (Visual Basic)

Invia il successivo elemento di una raccolta a un'istruzione di For Each...Next.

Yield expression

Parametri

Termine

Definizione

expression

Necessario.Un'espressione che sono implicitamente convertibile nel tipo di funzione o iteratori di accesso a Get contenente l'istruzione di Yield.

Note

L'istruzione di Yield restituisce un elemento di una raccolta alla volta.L'istruzione di Yield viene incluso in una funzione iteratori o in una funzione di accesso di Get, che eseguono le iterazioni personalizzate in una raccolta.

Si utilizza una funzione di iteratore utilizzando Istruzione For Each...Next (Visual Basic) o una query LINQ.Ogni iterazione del ciclo di For Each chiama la funzione di iteratore.Quando un'istruzione di Yield viene raggiunto la funzione di iteratore, expression viene restituito e la posizione corrente nel codice vengono mantenute.L'esecuzione verrà riavviata da tale percorso alla successiva apertura della funzione di iteratore è denominata.

Una conversione implicita deve esistere dal tipo di expression nell'istruzione di Yield al tipo restituito dell'iteratore.

È possibile utilizzare un'istruzione di Return o di Exit Function per terminare l'iterazione.

"Yield" non è una parola riservata e ha un significato speciale solo quando viene utilizzato in una funzione di Iterator o in una funzione di accesso di Get.

Per ulteriori informazioni sulle funzioni iteratori e sulle funzioni di accesso di Get, vedere Iteratori (C# e Visual Basic).

Funzioni e funzioni di accesso get di iteratore

La dichiarazione di una funzione iteratori o di una funzione di accesso Get deve soddisfare i seguenti requisiti:

Una funzione iteratori non può verificarsi di un evento, in un costruttore di istanza, in un costruttore statico, o un distruttore statico.

Una funzione iteratori può essere una funzione anonima.Per ulteriori informazioni, vedere Iteratori (C# e Visual Basic).

Gestione delle eccezioni

Un'istruzione di Yield può essere in un blocco di Try di Istruzione Try...Catch...Finally (Visual Basic).Un blocco Try con un'istruzione Yield può contenere blocchi Catch e può presentare un blocco Finally.

Un'istruzione Yield non può trovarsi all'interno di un blocco Catch o di un blocco Finally.

Se il corpo di For Each (l'esterno della funzione iteratori) genera un'eccezione, un blocco di Catch nella funzione iteratori non viene eseguito, ma un blocco di Finally nella funzione di iteratore viene eseguito.Un blocco Catch in una funzione iteratore rileva solo le eccezioni che si verificano nella funzione iteratore.

Implementazione tecnica

Il codice seguente restituisce IEnumerable (Of String) da una funzione iteratori e quindi scorrere gli elementi di IEnumerable (Of String).

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

La chiamata a MyIteratorFunction non esegue il corpo della funzione.Anziché la chiamata IEnumerable(Of String) nella variabile di elements.

In un'iterazione del ciclo di For Each, il metodo di MoveNext viene chiamato per elements.Questa chiamata viene eseguito il corpo di MyIteratorFunction fino a raggiungere la successiva istruzione di Yield.L'istruzione di Yield restituisce un'espressione che determina non solo il valore della variabile di element per l'utilizzo dal corpo del ciclo ma anche la proprietà di Current di elementi, che è IEnumerable (Of String).

In ogni iterazione successiva del ciclo di For Each, l'esecuzione del corpo iteratori continua da dove era stato interrotto, ancora arrestando quando raggiunge un'istruzione di Yield.Il ciclo di For Each completa quando la fine della funzione iteratori o un'istruzione di Exit Function o di Return viene soddisfatta.

Esempio

L'esempio seguente contiene un'istruzione di Yield presente in un ciclo di Per… next.Ogni iterazione del corpo dell'istruzione For Each in Main crea una chiamata alla funzione iteratore di Power.Ogni chiamata alla funzione iteratori procederà all'esecuzione di un'istruzione di Yield, che si verifica durante l'iterazione successiva del ciclo di For…Next.

Il tipo restituito del metodo di iteratore è IEnumerable<T>, un tipo di interfaccia iteratori.Quando il metodo di iteratore viene chiamato, restituisce un oggetto enumerabile che include potenze di un numero.

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

Il seguente esempio viene illustrata una funzione di accesso Get che è un iteratore.La dichiarazione di proprietà include un modificatore di Iterator.

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

Per ulteriori esempi, vedere Iteratori (C# e Visual Basic).

Requisiti

Visual Studio 2012

Vedere anche

Altre risorse

Iteratori (C# e Visual Basic)

Istruzioni (Visual Basic)