Yield ステートメント (Visual Basic)
For Each...Next のステートメントにコレクションの次の要素を送信します。
Yield expression
パラメーター
語句 |
定義 |
expression |
必須です。Yield のステートメントを含む Get の反復子関数またはアクセサーの型に暗黙に変換できる式。 |
解説
Yield のステートメントは、コレクションの 1 種類の要素を一度に返します。Yield のステートメントは、コレクションに対するカスタムの反復を実行 Get のアクセサー含まれており、または反復子関数で。
For Each...Next ステートメント (Visual Basic) または LINQ クエリを使用して、反復子の関数を実行します。For Each ループの各反復で反復子の関数を呼び出します。Yield のステートメントが反復子関数に到達すると、expression は戻り、コードの現在の位置は保持されます。実装はその位置から反復子関数が呼び出されると、に再起動されます。
暗黙の変換は Yield のステートメントの expression の型から反復子の戻り値の型にする必要があります。
イテレーションの末尾に Exit Function または Return のステートメントを使用できます。
" Get の Iterator の関数またはアクセサーで使用されている場合にのみ" yield に予約語ではなく、特別な意味を持ちます。
反復子の関数と Get のアクセサーの詳細については、反復子 (C# および Visual Basic)を参照してください。
反復子の関数は、アクセサーを取得し、
Get の反復子関数またはアクセサーの申告は、次の条件を満たす必要があります:
これは [反復子] 修飾子を含める必要があります。
戻り値の型は IEnumerable、IEnumerable<T>、IEnumerator、または IEnumerator<T>である必要があります。
これは ByRef のパラメーターを持つことはできません。
反復子の関数は、イベント インスタンス コンストラクター、静的コンストラクター、またはデストラクターで静的含めることはできません。
反復子の関数は、匿名関数です。詳細については、「反復子 (C# および Visual Basic)」を参照してください。
例外処理
Yield のステートメントは Try...Catch...Finally ステートメント (Visual Basic)の Try ブロックの中にある場合もあります。Yield のステートメントがある Try ブロックは Catch ブロックを持ち Finally のブロックを指定できます。
Yield のステートメントは CatchFinally ブロックまたはブロック内に置くことはできません。
反復子関数 (外) 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 のループ反復で、MoveNext のメソッドは elementsに対して呼び出されます。この呼び出しは Yield の次のステートメントに到達するまで MyIteratorFunction の本体を実行します。Yield のステートメントはループ本体で使用するための element 変数の値 **IEnumerable (Of String)**である、またはの要素のプロパティを Current だけでなく、決定しますが、式を返します。
For Each ループの各反復で、反復子本体の実行は Yield ステートメントに到達するときに中断した場所からか続行され、もう一度停止します。For Each ループの反復子は関数または Return または Exit Function ステートメントの最後に到達すると完了します。
使用例
次の例に 次に、… のループ内にある Yield のステートメントがあります。Main の [For Each] のステートメント本体の各反復で Power の反復子の関数への呼び出しを作成します。反復子の関数に対する各呼び出しは For…Next のループの次の反復処理中に発生する Yield の次のステートメントの実行に移動します。
反復子メソッドの戻り値の型は 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