Yield (Instrucción) (Visual Basic)

Envía el siguiente elemento de una colección a una For Each...Next instrucción .

Sintaxis

Yield expression  

Parámetros

Término Definición
expression Obligatorio. Expresión que se puede convertir implícitamente al tipo de la función de iterador o del Get accessor que contiene la Yield instrucción .

Comentarios

La Yield instrucción devuelve un elemento de una colección a la vez. La Yield instrucción se incluye en una función de iterador o un Get accessor, que realizan iteraciones personalizadas en una colección.

Se consume una función de iterador mediante un elemento For Each... Instrucción Next o una consulta LINQ. Cada iteración For Each del bucle llama a la función de iterador. Cuando se Yield alcanza una instrucción en la función de iterador, se devuelve y se conserva la ubicación actual en el expression código. La ejecución se reinicia desde esa ubicación la próxima vez que se llama a la función del iterador.

Debe existir una conversión implícita del tipo de expression en la instrucción al tipo de valor devuelto del Yield iterador.

Puede usar una instrucción Exit Function o para finalizar la Return iteración.

"Yield" no es una palabra reservada y tiene un significado especial solo cuando se usa en una Iterator función Get o un accessor.

Para obtener más información sobre las funciones de iterador y Get los accessors, vea Iteradores.

Funciones de iterador y obtener accessors

La declaración de una función o un accessor de iterador Get debe cumplir los siguientes requisitos:

No se puede producir una función de iterador en un evento, un constructor de instancia, un constructor estático o un destructor estático.

Una función de iterador puede ser una función anónima. Para obtener más información, consulta Iteradores.

Control de excepciones.

Una Yield instrucción puede estar dentro de un bloque de un Try try... Atrapar... Finally (Instrucción). Un Try bloque que tiene una instrucción puede tener Yield Catch bloques y puede tener un bloque Finally .

Una Yield instrucción no puede estar dentro de un bloque o un Catch Finally bloque.

Si el cuerpo (fuera de la función de iterador) produce una excepción, no se ejecuta un bloque de la función iterador, pero se ejecuta un bloque de la función For Each Catch de Finally iterador. Un bloque dentro de una función de iterador detecta solo las Catch excepciones que se producen dentro de la función de iterador.

Implementación técnica

El código siguiente devuelve un de una función de iterador y, a continuación, recorre en IEnumerable (Of String) iteración los elementos de IEnumerable (Of String) .

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

La llamada a MyIteratorFunction no ejecuta el cuerpo de la función. En su lugar, la llamada devuelve un valor IEnumerable(Of String) en la variable elements.

En una iteración del bucle For Each, se llama al método MoveNext para elements. Esta llamada ejecuta el cuerpo de MyIteratorFunction hasta que se alcanza la siguiente instrucción Yield. La instrucción devuelve una expresión que determina no solo el valor de la variable para su consumo por el cuerpo del bucle, sino también la propiedad de elementos , que Yield element es un Current IEnumerable (Of String) .

En cada iteración subsiguiente del bucle For Each, la ejecución del cuerpo del iterador continúa desde donde se dejó, deteniéndose de nuevo al alcanzar una instrucción Yield. El For Each bucle se completa cuando se alcanza el final de la función de iterador o Return una instrucción o Exit Function .

Ejemplo 1

El ejemplo siguiente tiene una Yield instrucción que está dentro de un for... Bucle siguiente. Cada iteración del cuerpo de instrucción For Each de crea una llamada a la función de Main Power iterador. Cada llamada a la función de iterador prosigue con la siguiente ejecución de la instrucción Yield, que se produce durante la siguiente iteración del bucle For…Next.

El tipo de valor devuelto del método iterador es IEnumerable<T> , un tipo de interfaz de iterador. Cuando se llama al método iterador, este devuelve un objeto enumerable que contiene las potencias de un número.

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

Ejemplo 2

En el ejemplo siguiente se muestra un descriptor de acceso Get que es un iterador. La declaración de propiedad incluye un Iterator modificador .

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

Para obtener ejemplos adicionales, vea Iteradores.

Vea también