Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 en el tipo de la función de iterador o Get descriptor de acceso que contiene la Yield instrucción . |
Observaciones
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 Get descriptor de acceso, que realiza iteraciones personalizadas en una colección.
Se consume una función de iterador mediante un for each... Next Statement o una consulta LINQ. Cada iteración del For Each bucle llama a la función de iterador. Cuando se alcanza una Yield instrucción en la función de iterador, expression se devuelve y se conserva la ubicación actual en el código. La ejecución se reinicia desde esa ubicación la próxima vez que se llame a la función iterador.
Debe existir una conversión implícita del tipo de expression en la Yield instrucción al tipo de valor devuelto del iterador.
Puede usar una Exit Function instrucción o Return para finalizar la iteración.
"Yield" no es una palabra reservada y tiene un significado especial solo cuando se usa en una Iterator función o Get descriptor de acceso.
Para obtener más información sobre las funciones de iterador y Get los descriptores de acceso, vea Iteradores.
Funciones de iterador y descriptores de acceso Get
La declaración de una función o Get descriptor de acceso de iterador debe cumplir los siguientes requisitos:
Debe incluir un modificador Iterator .
El tipo de valor devuelto debe ser IEnumerable, IEnumerable<T>, IEnumeratoro IEnumerator<T>.
No puede tener ningún
ByRefparámetro.
No se puede producir una función de iterador en un evento, constructor de instancia, 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, consulta Iteradores.
Control de excepciones
Una Yield instrucción puede estar dentro de un Try bloque de un try... Atrapar... Finally (Instrucción). Un Try bloque que tiene una Yield instrucción puede tener Catch bloques y puede tener un Finally bloque.
Una Yield instrucción no puede estar dentro de un Catch bloque o un Finally bloque.
Si el For Each cuerpo (fuera de la función de iterador) produce una excepción, no se ejecuta un Catch bloque de la función iterador, pero se ejecuta un Finally bloque de la función iterador. Un Catch bloque dentro de una función de iterador detecta solo excepciones que se producen dentro de la función de iterador.
Implementación técnica
El código siguiente devuelve un IEnumerable (Of String) objeto de una función de iterador y, 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 ejecuta el cuerpo de la función. En su lugar, la llamada devuelve un IEnumerable(Of String) objeto en la elements variable .
En una iteración del For Each bucle, se llama al MoveNext método para elements. Esta llamada ejecuta el cuerpo de MyIteratorFunction hasta que se alcanza la instrucción siguiente Yield . La Yield instrucción devuelve una expresión que determina no solo el valor de la element variable para su consumo por el cuerpo del bucle, sino también la Current propiedad de los elementos, que es .IEnumerable (Of String)
En cada iteración posterior del For Each bucle, la ejecución del cuerpo del iterador continúa desde donde se dejó, de nuevo deteniendo cuando alcanza una Yield instrucción . El For Each bucle se completa cuando se alcanza el final de la función de iterador o una Return 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 la instrucción For Each de Main crea una llamada a la Power función iterador. Cada llamada a la función iterador continúa con la siguiente ejecución de la Yield instrucción , que se produce durante la siguiente iteración del For…Next bucle.
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, 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 Get descriptor de acceso 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, consulte Iteradores.