Yield 语句 (Visual Basic)

将集合的下一个元素发送到 For Each...Next 语句。

语法

Yield expression  

参数

术语 定义
expression 必需。 可隐式转换为迭代器函数或包含该语句的访问器的类型的表达式 Get Yield

备注

Yield语句一次返回集合中的一个元素。 Yield语句包含在迭代器函数或 Get 访问器中,后者对集合执行自定义迭代。

使用 For Each ... 的方法使用迭代器函数 Next 语句 或 LINQ 查询。 循环的每次迭代都会 For Each 调用迭代器函数。 当 Yield 在迭代器函数中到达语句时, expression 将返回,并且保留代码中的当前位置。 下次调用迭代器函数时,将从该位置重新开始执行。

隐式转换必须从语句中的类型 expression Yield 到迭代器的返回类型存在。

您可以使用 Exit FunctionReturn 语句结束迭代。

"Yield" 不是保留字,只在 Iterator 函数或访问器中使用时具有特殊意义 Get

有关迭代器函数和访问器的详细信息 Get ,请参阅 迭代器。

迭代器函数和 Get 访问器

迭代器函数或 Get 访问器的声明必须满足以下要求:

迭代器函数不能出现在事件、实例构造函数、静态构造函数或静态析构函数中。

迭代器函数可以是匿名函数。 有关更多信息,请参见 迭代器

异常处理

Yield语句可以在 Try Try ... 的块内Catch .。。Finally 语句Try带有语句的块 Yield 可以有 Catch 块,并且可以有 Finally 块。

Yield语句不能位于 Catch 块或 Finally 块中。

如果在 For Each 迭代器函数外 (主体) 引发异常,则 Catch 不会执行迭代器函数中的块,但 Finally 会执行迭代器函数中的块。 CatchIterator 函数内的块仅捕获 iterator 函数内发生的异常。

技术实现

下面的代码 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 语句后才会停止。 For Each当达到 iterator 函数或或语句的末尾时,循环 Return Exit Function 就会完成。

示例 1

下面的示例包含一个 Yield 位于 For .。。下一个 循环。 中 个语句体的每次迭代 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

示例 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

有关其他示例,请参阅 迭代器。

请参阅