컬렉션의 다음 요소를 문으로 보냅니다 For Each...Next .
문법
Yield expression
매개 변수
| 기간 | 정의 |
|---|---|
expression |
필수 사항입니다. 문을 포함하는 반복기 함수 또는 Get 접근자의 형식으로 암시적으로 변환할 수 있는 식입니다 Yield . |
비고
이 문은 Yield 컬렉션의 요소를 한 번에 하나씩 반환합니다. 이 Yield 문은 컬렉션에 대해 사용자 지정 반복을 수행하는 반복기 함수 또는 Get 접근자에 포함됩니다.
For Each...를 사용하여 반복기 함수를 사용합니다 . 다음 문 또는 LINQ 쿼리입니다. 루프의 각 반복은 For Each 반복기 함수를 호출합니다.
Yield 반복기 함수 expression 에서 문에 도달하면 반환되고 코드의 현재 위치가 유지됩니다. 다음에 반복기 함수가 호출될 때 해당 위치에서 실행이 다시 시작됩니다.
문에 있는 Yield 형식에서 반복기의 반환 형식 expression 으로 암시적 변환이 있어야 합니다.
Exit Function 문이나 Return 문을 사용하여 반복을 종료할 수 있습니다.
"Yield"는 예약된 단어가 아니며 함수 또는 Get 접근자에서 Iterator 사용되는 경우에만 특별한 의미를 가집니다.
반복기 함수 및 Get 접근자에 대한 자세한 내용은 반복기를 참조하세요.
반복기 함수 및 Get 접근자
반복기 함수 또는 Get 접근자의 선언은 다음 요구 사항을 충족해야 합니다.
반복기 한정자를 포함해야 합니다.
반환 형식은 , , IEnumerable<T>IEnumerator또는 IEnumerator<T>.이어야 IEnumerable합니다.
매개 변수를 사용할
ByRef수 없습니다.
반복기 함수는 이벤트, 인스턴스 생성자, 정적 생성자 또는 정적 소멸자에서 발생할 수 없습니다.
반복기 함수는 익명 함수일 수 있습니다. 자세한 내용은 반복기를 참조하세요.
예외 처리
문은 Yield Try의 블록 내에 Try 있을 수 있습니다 ... 잡기... Finally 문입니다.
Try 문을 포함하는 블록에는 Yield 블록이 있을 수 있으며 Catch 블록을 가질 수 있습니다.
Yield 문은 Catch 블록 또는 Finally 블록 내에 있을 수 없습니다.
반복기 함수 외부의 For Each 본문에서 예외가 throw되면 반복기 함수의 Catch 블록이 실행되지 않지만 반복기 함수의 Finally 블록이 실행됩니다. 반복기 함수 내의 Catch 블록은 반복기 함수 내에서 발생하는 예외만 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됩니다. 이 호출은 다음 Yield 문에 도달할 때까지 본 MyIteratorFunction 문을 실행합니다. 이 문은 Yield 루프 본문 Current 에서 사용할 변수의 element 값뿐만 아니라 요소의 속성(IEnumerable (Of String)입니다.)을 결정하는 식을 반환합니다.
루프의 For Each 후속 반복마다 반복기 본문의 실행은 중단된 위치에서 계속되며 문에 Yield 도달하면 다시 중지됩니다.
For Each 반복기 함수 또는 ReturnExit Function 문 끝에 도달하면 루프가 완료됩니다.
예제 1
다음 예제에는 YieldFor... 다음 루프.
For Each 문 본문의 각 반복은 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