共用方式為


Yield 語句 (Visual Basic)

將集合的下一個項目傳送至 For Each...Next 語句。

語法

Yield expression  

參數

術語 定義
expression 必須的。 可隱含轉換成包含 Yield 語句之反覆運算器函式或Get存取子類型的運算式。

備註

語句 Yield 會一次傳回集合的一個專案。 語句 Yield 包含在反覆器函式或 Get 存取子中,它會在集合上執行自定義反覆專案。

您可以使用 For Each... 來取用反覆運算器函式 ...Next 語句 或 LINQ 查詢。 迴圈的每個反覆項目 For Each 都會呼叫反覆運算器函式。 Yield在反覆運算器函式中到達 語句時,expression會傳回 ,並保留程式代碼中的目前位置。 下次呼叫反覆運算器函式時,會從該位置重新啟動執行。

隱含轉換必須存在於語句中的 Yieldexpression別到反覆運算器的傳回型別。

您可以使用 Exit FunctionReturn 語句結束反覆專案。

“Yield” 不是保留字,只有在函式或Get存取子中使用Iterator時,才會有特殊意義。

如需反覆運算器函式和 Get 存取子的詳細資訊,請參閱 反覆運算器

反覆運算器函式和 Get 存取子

反覆運算器函式或 Get 存取子的宣告必須符合下列需求:

反覆運算器函式不能發生在事件、實例建構函式、靜態建構函式或靜態解構函式中。

反覆運算器函式可以是匿名函式。 如需詳細資訊,請參閱 Iterator

例外狀況處理

Yield語句可以位於 Try 的區塊內Try...抓住。。。Finally 語句。 具有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 語句時再次停止。 當到達反覆運算器函式或 ReturnExit Function 語句的結尾時,迴圈For Each就會完成。

範例 1

下列範例有位於 YieldFor... 內的 語句下一個 迴圈。 中 Main 語句主體的每個反覆運算都會建立反覆運算器函式的Power呼叫。 反覆運算器函式的每個呼叫都會繼續進行語句的下一個執行 Yield ,這會在迴圈的下一個反覆運算 For…Next 期間發生。

Iterator 方法的傳回型別為 ,是 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

如需其他範例,請參閱 反覆運算器

另請參閱