Iterador (Visual Basic)

Especifica que uma função ou acessador Get é um iterador.

Comentários

Um método iterador executa uma iteração personalizada em uma coleção. Um iterador usa a instrução Yield para retornar um elemento da coleção por vez. Quando uma instrução Yield for atingida, o local atual no código será retido. A execução será reiniciada desse local na próxima vez que a função iteradora for chamada.

Um iterador pode ser implementado como função ou acessador Get de uma definição de propriedade. O modificador Iterator aparece na declaração da função de iterador ou do acessador Get.

Chame um iterador de um código de cliente usando uma Instrução For Each...Next.

O tipo de retorno de uma função de iterador ou acessador Get pode ser IEnumerable, IEnumerable<T>, IEnumerator ou IEnumerator<T>.

Um iterador não pode ter parâmetros ByRef.

Um iterador não pode ocorrer em um evento, um construtor de instância, um construtor estático ou um destruidor estático.

Um iterador pode ser função anônima. Para obter mais informações, consulte Iteradores.

Uso

O modificador Iterator pode ser usado nestes contextos:

Exemplo 1

O exemplo a seguir demonstra o uso de uma função de iterador. A função de iterador tem uma instrução Yield que está em um loop For…Next. Cada iteração do corpo da instrução For Each em Main cria uma chamada para a Powerfunção de iterador. Cada chamada à função iteradora prossegue para a próxima execução da instrução Yield que ocorre durante a próxima iteração do loop For…Next.

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

Exemplo 2

O exemplo a seguir demonstra um acessador Get que é um iterador. O modificador Iterator está na declaração de propriedade.

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 obter mais exemplos adicionais, consulte Iteradores.

Confira também