Condividi tramite


Istruzione Yield (Visual Basic)

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

Sintassi

Yield expression  

Parametri

Termine Definizione
expression Obbligatorio. Espressione convertibile in modo implicito nel tipo della funzione iteratore o Get della funzione di accesso che contiene l'istruzione Yield .

Osservazioni:

L'istruzione Yield restituisce un elemento di una raccolta alla volta. L'istruzione Yield è inclusa in una funzione iteratore o Get in una funzione di accesso, che esegue iterazioni personalizzate su una raccolta.

Si utilizza una funzione iteratore usando un for each... Istruzione successiva o query LINQ. Ogni iterazione del For Each ciclo chiama la funzione iteratore. Quando viene raggiunta un'istruzione Yield nella funzione iteratore, expression viene restituita e viene mantenuta la posizione corrente nel codice. L'esecuzione viene riavviata da tale posizione alla successiva chiamata della funzione iteratore.

È necessario che esista una conversione implicita dal tipo di expression nell'istruzione Yield al tipo restituito dell'iteratore.

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

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

Per altre informazioni sulle funzioni iteratori e Get sulle funzioni di accesso, vedere Iteratori.

Funzioni iteratore e funzioni di accesso Get

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

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

Una funzione iteratore può essere una funzione anonima. Per altre informazioni, vedere Iteratori.

Gestione delle eccezioni

Un'istruzione Yield può trovarsi all'interno di un Try blocco di un oggetto Try... Prendere... Istruzione Finally. Un Try blocco con un'istruzione Yield può avere Catch blocchi e può avere un Finally blocco.

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

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

Implementazione tecnica

Il codice seguente restituisce un oggetto IEnumerable (Of String) da una funzione iteratore e quindi scorre gli elementi dell'oggetto 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. La chiamata restituisce invece un oggetto IEnumerable(Of String) nella elements variabile .

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

In ogni iterazione successiva del For Each ciclo, l'esecuzione del corpo dell'iteratore continua da dove è stata interrotta, arrestando di nuovo quando raggiunge un'istruzione Yield . Il For Each ciclo viene completato quando viene raggiunta la fine della funzione iteratore o un'istruzione Return o Exit Function .

Esempio 1

Nell'esempio seguente è presente un'istruzione Yield che si trova all'interno di un for... Ciclo successivo . Ogni iterazione del corpo dell'istruzione For Each in Main crea una chiamata alla Power funzione iteratore. Ogni chiamata alla funzione iteratore procede all'esecuzione successiva dell'istruzione Yield , che si verifica durante l'iterazione successiva del For…Next ciclo.

Il tipo restituito del metodo iteratore è IEnumerable<T>, un tipo di interfaccia iteratore. Quando viene chiamato il metodo iteratore, restituisce un oggetto enumerabile che contiene le 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

Esempio 2

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

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 altri esempi, vedere Iteratori.

Vedere anche