Iterator (Visual Basic)
Określa, że funkcja lub Get
akcesorium jest iteratorem.
Uwagi
Iterator wykonuje iterację niestandardową w kolekcji. Iterator używa instrukcji Yield , aby zwrócić każdy element w kolekcji pojedynczo. Po osiągnięciu instrukcji bieżąca Yield
lokalizacja w kodzie jest zachowywana. Wykonanie jest uruchamiane ponownie z tej lokalizacji przy następnym wywołaniu funkcji iteratora.
Iterator można zaimplementować jako funkcję lub jako metodę Get
dostępu do definicji właściwości. Modyfikator Iterator
pojawia się w deklaracji funkcji iteratora lub Get
metody dostępu.
Iterator jest wywoływany z kodu klienta przy użyciu elementu Dla każdego... Następna instrukcja.
Zwracany typ funkcji iteratora lub Get
metody dostępu może być IEnumerable, IEnumerable<T>, IEnumeratorlub IEnumerator<T>.
Iterator nie może mieć żadnych ByRef
parametrów.
Iterator nie może wystąpić w przypadku zdarzenia, konstruktora wystąpienia, konstruktora statycznego lub destruktora statycznego.
Iterator może być funkcją anonimową. Aby uzyskać więcej informacji, zobacz Iteratory.
Użycie
Modyfikator Iterator
może być używany w następujących kontekstach:
Przykład 1
W poniższym przykładzie pokazano funkcję iteratora. Funkcja iteratora ma instrukcję Yield
wewnątrz elementu For... Następna pętla. Każda iteracja treści instrukcji For Each w Main
obiekcie tworzy wywołanie funkcji iteratora Power
. Każde wywołanie funkcji iteratora przechodzi do następnego wykonania Yield
instrukcji, która występuje podczas następnej For…Next
iteracji pętli.
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
Przykład 2
W poniższym przykładzie pokazano metodę Get
dostępu, która jest iteratorem. Modyfikator Iterator
znajduje się w deklaracji właściwości.
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
Aby uzyskać dodatkowe przykłady, zobacz Iteratory.