次の方法で共有


Yield ステートメント (Visual Basic)

コレクションの次の要素を For Each...Next ステートメントに送信します。

構文

Yield expression  

パラメーター

任期 定義
expression 必須。 反復子関数の型またはYield ステートメントを含むアクセサーGet暗黙的に変換できる式。

注釈

Yield ステートメントは、一度に 1 つのコレクションの要素を返します。 Yield ステートメントは、コレクションに対してカスタム反復処理を実行する反復子関数または Get アクセサーに含まれています。

For Each... を使用して反復子関数を使用 します。Next ステートメント または LINQ クエリ。 For Each ループの各反復処理では、反復子関数が呼び出されます。 反復子関数で Yield ステートメントに達すると、 expression が返され、コード内の現在の位置が保持されます。 反復子関数が次回呼び出されるときに、その場所から実行が再開されます。

Yield ステートメント内のexpressionの型から反復子の戻り値の型への暗黙的な変換が存在する必要があります。

Exit FunctionまたはReturnステートメントを使用して、イテレーションを終了できます。

"Yield" は予約語ではなく、 Iterator 関数または Get アクセサーで使用される場合にのみ特別な意味を持ちます。

反復子関数と Get アクセサーの詳細については、「 反復子」を参照してください。

反復子関数と Get アクセサー

反復子関数または Get アクセサーの宣言は、次の要件を満たしている必要があります。

反復子関数は、イベント、インスタンス コンストラクター、静的コンストラクター、または静的デストラクターでは発生できません。

反復子関数には匿名関数を指定できます。 詳細については、「 反復子」を参照してください。

例外処理

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の呼び出しでは、関数の本体は実行されません。 代わりに、呼び出しはelements変数にIEnumerable(Of String)を返します。

For Each ループの反復処理では、elementsに対してMoveNext メソッドが呼び出されます。 この呼び出しは、次の Yield ステートメントに達するまで、MyIteratorFunctionの本文を実行します。 Yield ステートメントは、ループ本体で使用するelement変数の値だけでなく、IEnumerable (Of String)である要素のCurrentプロパティも決定する式を返します。

For Each ループの後続の反復のたびに、反復子本体の実行は中断した場所から継続され、Yield ステートメントに達すると再び停止します。 For Each ループは、反復子関数またはReturnまたはExit Functionステートメントの末尾に達すると完了します。

例 1

次の例には、For... 内に 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

例 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

その他の例については、「 反復子」を参照してください。

こちらも参照ください