迭代器 (Visual Basic)
指定函数或 Get
访问器是迭代器。
注解
迭代器对集合执行自定义迭代。 迭代器使用 Yield 语句返回集合的每一个元素,每次返回一个元素。 到达 Yield
语句时,会保留当前在代码中的位置。 下次调用迭代器函数时,将从该位置重新开始执行。
迭代器可以实现为函数或属性定义的 Get
访问器。 Iterator
修饰符出现在迭代器函数或 Get
访问器的声明中。
通过使用 For Each...Next 语句从客户端代码调用迭代器。
迭代器函数或 Get
访问器的返回类型可以是 IEnumerable、IEnumerable<T>、IEnumerator 或 IEnumerator<T>。
迭代器不能有任何 ByRef
参数。
不能在事件、实例构造函数、静态构造函数或静态析构函数中使用迭代器。
迭代器可以是匿名函数。 有关更多信息,请参见 迭代器。
使用情况
Iterator
修饰符可用于下面的上下文中:
示例 1
以下示例演示了迭代器函数。 迭代器函数具有位于 For…Next 循环中的 Yield
语句。 Main
中的 For Each 语句体的每次迭代都会创建对 Power
迭代器函数的调用。 对迭代器函数的每个调用将继续到 Yield
语句的下一次执行(在 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
示例 2
下面的示例演示一个作为迭代器的 Get
访问器。 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
有关其他示例,请参阅迭代器。