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:
Debe incluir un modificador de Iterador.
El tipo de valor devuelto debe ser IEnumerable, IEnumerable<T>, IEnumerator, o IEnumerator<T>.
No puede tener ningún parámetro de ByRef.
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<T>, 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