コレクションの次の要素を 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
アクセサーの宣言は、次の要件を満たしている必要があります。
反復子修飾子を含める必要があります。
戻り値の型は、 IEnumerable、 IEnumerable<T>、 IEnumerator、または IEnumerator<T>である必要があります。
ByRef
パラメーターを含めることはできません。
反復子関数は、イベント、インスタンス コンストラクター、静的コンストラクター、または静的デストラクターでは発生できません。
反復子関数には匿名関数を指定できます。 詳細については、「 反復子」を参照してください。
例外処理
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
その他の例については、「 反復子」を参照してください。
こちらも参照ください
.NET