Yield 문(Visual Basic)Yield Statement (Visual Basic)

컬렉션의 다음 요소를 For Each...Next 문으로 보냅니다.Sends the next element of a collection to a For Each...Next statement.

구문Syntax

Yield expression  

매개 변수Parameters

용어Term 정의Definition
expression 필수 요소.Required. @No__t_1 문을 포함 하는 반복기 함수 또는 Get 접근자의 형식으로 암시적으로 변환할 수 있는 식입니다.An expression that is implicitly convertible to the type of the iterator function or Get accessor that contains the Yield statement.

주의Remarks

@No__t_0 문은 한 번에 한 컬렉션의 요소를 반환 합니다.The Yield statement returns one element of a collection at a time. @No__t_0 문은 컬렉션에 대해 사용자 지정 반복을 수행 하는 반복기 함수 또는 Get 접근자에 포함 되어 있습니다.The Yield statement is included in an iterator function or Get accessor, which perform custom iterations over a collection.

For Each ...를 사용 하 여 반복기 함수를 사용 합니다. 다음 문 또는 LINQ 쿼리입니다.You consume an iterator function by using a For Each...Next Statement or a LINQ query. @No__t_0 루프의 각 반복은 반복기 함수를 호출 합니다.Each iteration of the For Each loop calls the iterator function. 반복기 함수에서 Yield 문에 도달 하면 expression 반환 되 고 코드에서 현재 위치가 유지 됩니다.When a Yield statement is reached in the iterator function, expression is returned, and the current location in code is retained. 다음에 반복기 함수가 호출되면 해당 위치에서 실행이 다시 시작됩니다.Execution is restarted from that location the next time that the iterator function is called.

@No__t_1 문의 expression 형식에서 반복기의 반환 형식으로의 암시적 변환이 있어야 합니다.An implicit conversion must exist from the type of expression in the Yield statement to the return type of the iterator.

@No__t_0 또는 Return 문을 사용 하 여 반복을 종료할 수 있습니다.You can use an Exit Function or Return statement to end the iteration.

"Yield"는 예약 된 단어가 아니므로 Iterator 함수 또는 Get 접근자에서 사용 되는 경우에만 특별 한 의미가 있습니다."Yield" is not a reserved word and has special meaning only when it is used in an Iterator function or Get accessor.

반복기 함수 및 Get 접근자에 대 한 자세한 내용은 반복기를 참조 하세요.For more information about iterator functions and Get accessors, see Iterators.

반복기 함수 및 Get 접근자Iterator Functions and Get Accessors

반복기 함수 또는 Get 접근자의 선언은 다음 요구 사항을 충족 해야 합니다.The declaration of an iterator function or Get accessor must meet the following requirements:

반복기 함수는 이벤트, 인스턴스 생성자, 정적 생성자 또는 정적 소멸자에서 발생할 수 없습니다.An iterator function cannot occur in an event, instance constructor, static constructor, or static destructor.

반복기 함수는 익명 함수 일 수 있습니다.An iterator function can be an anonymous function. 자세한 내용은 반복기를 참조하세요.For more information, see Iterators.

예외 처리Exception Handling

@No__t_0 문은 Try ...의 Try 블록 안에 있을 수 있습니다. Catch ... Finally 문.A Yield statement can be inside a Try block of a Try...Catch...Finally Statement. @No__t_1 문을 포함 하는 Try 블록은 Catch 블록을 포함할 수 있으며 Finally 블록을 포함할 수 있습니다.A Try block that has a Yield statement can have Catch blocks, and can have a Finally block.

@No__t_0 문은 Catch 블록 또는 Finally 블록 안에 있을 수 없습니다.A Yield statement cannot be inside a Catch block or a Finally block.

@No__t_0 본문 (반복기 함수 외부)에서 예외를 throw 하는 경우 반복기 함수의 Catch 블록이 실행 되지 않지만 반복기 함수의 Finally 블록이 실행 됩니다.If the For Each body (outside of the iterator function) throws an exception, a Catch block in the iterator function is not executed, but a Finally block in the iterator function is executed. 반복기 함수 내의 Catch 블록은 반복기 함수 내에서 발생 하는 예외만 catch 합니다.A Catch block inside an iterator function catches only exceptions that occur inside the iterator function.

기술 구현Technical Implementation

다음 코드는 반복기 함수에서 IEnumerable (Of String)를 반환한 다음 IEnumerable (Of String)의 요소를 반복 합니다.The following code returns an IEnumerable (Of String) from an iterator function and then iterates through the elements of the IEnumerable (Of String).

Dim elements As IEnumerable(Of String) = MyIteratorFunction()  
    …  
For Each element As String In elements  
Next  

@No__t_0에 대 한 호출은 함수 본문을 실행 하지 않습니다.The call to MyIteratorFunction doesn't execute the body of the function. 대신에 IEnumerable(Of String) 변수에 elements을 반환합니다.Instead the call returns an IEnumerable(Of String) into the elements variable.

For Each 루프 반복에서 MoveNext에 대한 elements 메서드가 호출됩니다.On an iteration of the For Each loop, the MoveNext method is called for elements. 이 호출은 다음 MyIteratorFunction 문에 도달할 때까지 Yield 본문을 실행합니다.This call executes the body of MyIteratorFunction until the next Yield statement is reached. @No__t_0 문은 루프 본문에서 사용 하는 element 변수 값 뿐만 아니라 요소의 Current 속성 (IEnumerable (Of String))을 결정 하는 식을 반환 합니다.The Yield statement returns an expression that determines not only the value of the element variable for consumption by the loop body but also the Current property of elements, which is an IEnumerable (Of String).

이후에 For Each 루프가 반복될 때마다 중지되었던 위치에서 반복기 본문 실행이 계속되고 Yield 문에 도달하면 다시 중지됩니다.On each subsequent iteration of the For Each loop, the execution of the iterator body continues from where it left off, again stopping when it reaches a Yield statement. @No__t_0 루프는 반복기 함수 또는 Return 또는 Exit Function 문의 끝에 도달 하면 완료 됩니다.The For Each loop completes when the end of the iterator function or a Return or Exit Function statement is reached.

예제Example

다음 예제에는 에 대 한 Yield 문이 있습니다. Next 루프.The following example has a Yield statement that is inside a For…Next loop. @No__t_1의 각 문 본문 에 대 한 각 반복은 Power 반복기 함수에 대 한 호출을 만듭니다.Each iteration of the For Each statement body in Main creates a call to the Power iterator function. 반복기 함수를 호출할 때마다 다음에 Yield 루프를 반복하는 도중에 For…Next 문이 실행됩니다.Each call to the iterator function proceeds to the next execution of the Yield statement, which occurs during the next iteration of the For…Next loop.

반복기 메서드의 반환 형식은 IEnumerable<T> 반복기 인터페이스 형식입니다.The return type of the iterator method is IEnumerable<T>, an iterator interface type. 반복기 메서드가 호출되면 숫자의 거듭제곱이 들어 있는 열거형 개체를 반환합니다.When the iterator method is called, it returns an enumerable object that contains the powers of a number.

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

예제Example

다음 예제는 반복기인 Get 접근자에 대해 설명합니다.The following example demonstrates a Get accessor that is an iterator. 속성 선언에 Iterator 한정자가 포함 되어 있습니다.The property declaration includes an Iterator modifier.

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

추가 예제는 반복기를 참조 하세요.For additional examples, see Iterators.

참조See also