Yield 语句 (Visual Basic)
发送集合中的下一个元素。For Each...Next 语句。
Yield expression
参数
术语 |
定义 |
expression |
必需。隐式转换为迭代器函数或 Get 访问器的类型包含 Yield 语句的表达式。 |
备注
Yield 语句次返回集合中的元素。Yield 语句在迭代器函数或 Get 访问器,包括对集合的自定义迭代。
使用 For Each...Next 语句 (Visual Basic) 或 LINQ 查询,则使用迭代器函数。For Each 循环的每次迭代调用迭代器函数。当 Yield 语句在迭代器函数时为止,expression 返回,并且,代码的当前位置保留。执行从该位置下次重新启动迭代器函数调用。
隐式转换必须从 expression 的类型。Yield 语句的提供给迭代器的返回类型。
可以使用 Exit Function "或 Return 语句结束迭代。
只有 + 当用于 Iterator 函数或 Get 访问器时,“生成”不是保留字并具有特殊含义。
有关迭代器函数和 Get 访问器的更多信息,请参见 迭代器(C# 和 Visual Basic)。
迭代器函数和 get 访问器
迭代器函数或 Get 访问器的声明必须满足以下要求:
它必须包含 迭代器 修饰符。
返回类型必须是 IEnumerable、IEnumerable<T>、IEnumerator或 IEnumerator<T>。
它不能有任何 ByRef 参数。
迭代器函数在事件、实例构造函数、静态构造函数或静态析构函数不能出现。
迭代器函数可以是匿名函数。有关更多信息,请参见迭代器(C# 和 Visual Basic)。
异常处理
Yield 语句将在 Try 块 Try...Catch...Finally 语句 (Visual Basic)。Try 块有一个 Yield 语句可以具有 Catch 块,并可以具有 Finally 块。
Yield 语句不能在 Catch 块或 Finally 块。
如果 For Each 主体 (在迭代器函数之外) 引发异常,Catch 在迭代器功能块,不会执行,但 Finally 在迭代器功能块中执行。Catch 块在迭代器功能出现在迭代器函数内仅捕获的异常中。
技术实现
下面的代码从返回的迭代器函数的 IEnumerable (Of String) 通过 **IEnumerable (Of String)**的元素然后重复。
Dim elements As IEnumerable(Of String) = MyIteratorFunction()
…
For Each element As String In elements
Next
为 MyIteratorFunction 的调用不执行该函数体。而是调用返回 IEnumerable(Of String) 到 elements 变量中。
在 For Each 循环迭代中,MoveNext 方法。elements调用。这称为执行 MyIteratorFunction 主体,直至下一个 Yield 语句为止。Yield 语句返回由循环体确定 element 变量的值不仅消耗的,而且元素 Current 属性,是 **IEnumerable (Of String)**的表达式。
在 For Each 循环的每个后续迭代中,迭代器体中执行从延续它将会停止的位置,再次停止,在到达 Yield 语句时。在迭代器函数或 Return 或 Exit Function 语句的结尾时,For Each 循环完成。
示例
下面的示例有在 for…next 循环内的一个 Yield 语句。对于每个 语句体的每个迭代在 Main 的创建调用 Power 迭代器函数。每个调用迭代器函数提升到 Yield 语句的下执行,在 For…Next 循环的下一次迭代时发生。
迭代器方法的返回类型为 IEnumerable<T>,迭代器接口类型。在迭代器方法被调用时,它返回一个的幂的可枚举对象。
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
下面的示例演示是迭代器的 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
有关其他示例,请参见迭代器(C# 和 Visual Basic)。
要求
Visual Studio 2012