Yield (Instrucción) (Visual Basic)

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

Yield expression

Parámetros

Término

Definición

expression

Requerido. Una expresión que es implícitamente convertible al tipo de función de iterador o de descriptor de acceso Get que contiene la instrucción de Yield.

Comentarios

La instrucción de Yield devuelve un elemento de una colección al mismo tiempo. La instrucción de Yield se incluye en una función de iterador o un descriptor de acceso de Get, que realizan iteraciones personalizadas en una colección.

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

Una conversión implícita debe existir del tipo de expression en la instrucción de Yield el tipo de valor devuelto del iterador.

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

La “producción” no es una palabra reservada y tiene un significado especial únicamente cuando se utiliza en una función de Iterator o un descriptor de acceso de Get.

Para obtener más información sobre las funciones de iterador y los descriptores de Get, vea Iteradores (C# y Visual Basic).

Las funciones de iterador y los descriptores de acceso

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

Una función de iterador no puede aparecer en un evento, un constructor de instancia, un constructor estático, o destructor estático.

Una función de iterador puede ser una función anónima. Para obtener más información, vea Iteradores (C# y Visual Basic).

Control de excepciones

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

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

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

Implementación técnica

El código siguiente devuelve IEnumerable (Of String) de una función de iterador a continuación recorre en 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 se ejecuta el cuerpo de la función. En su lugar la llamada devuelve IEnumerable(Of String) en la variable de elements.

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

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

Ejemplo

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

El tipo de valor devuelto del método de iterador es IEnumerable, tipo de interfaz del iterador. Cuando se llama al método de iterador, devuelve un objeto enumerable que contiene los 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

El ejemplo siguiente se muestra un descriptor de acceso de Get que sea un iterador. La declaración de propiedad incluye un modificador de 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

Para obtener otros ejemplos, vea Iteradores (C# y Visual Basic).

Requisitos

Visual Studio 2012

Vea también

Otros recursos

Iteradores (C# y Visual Basic)

Instrucciones (Visual Basic)