Оператор Yield (Visual Basic)

Отправляет следующий элемент коллекции в инструкцию For Each...Next.

Yield expression

Параметры

Термин

Определение

expression

Обязательное. Выражение, которое неявно преобразовать в значение типа функции итератора или доступа Get, который содержит оператора Yield.

Заметки

Выписка Yield возвращает один элемент коллекции одновременно. Выписка Yield включена в функции итератора или доступе Get, которая выполняет пользовательские итерации по коллекции.

Используется функция итератора с помощью Оператор For Each... Next (Visual Basic) или запроса LINQ. Все итерации цикла For Each вызывает функцию итератора. При достижении выписка Yield в функции итератора, возвращается значение expression и текущего расположения в коде сохраняются. Среда выполнения будет перезапуске из этого расположения при следующем вызове функции итератора данной функции.

Неявное преобразование должно существовать из типа expression в инструкцию Yield к возвращаемому типу итератора.

Можно использовать выписка Exit Function или Return для выполнения итерации.

"Выход" нет зарезервированого ключевые слова и имеет специальное значение, только если он используется в доступе функции Iterator или Get.

Дополнительные сведения о функциях итератора доступах и Get см. в разделе Итераторы (C# и Visual Basic).

Функции итератора и получают доступ

Объявление функции итератора или доступа Get должно отвечать следующим требованиям.

Функция итератора, не может содержаться в событии, конструкторе экземпляра, статическим конструктором, или статическом деструкторе.

Функция итератора может быть анонимной функции. Для получения дополнительной информации см. Итераторы (C# и Visual Basic).

Обработка исключений

Выписка Yield может быть внутри блока TryОператор Try... Catch... Finally (Visual Basic). Блок 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 не выполняет тело функции. Вместо этого вызов возвращается в переменную **IEnumerable(Of String)**elements.

В итерации цикла For Each, метод MoveNext вызывается для elements. Этот вызов выполняется тело MyIteratorFunction до тех пор, пока не будет достигнут следующую выписка Yield. Выписка Yield возвращает не только выражение, задающее значение переменной element для использования циклом, но и свойства элементов Current, IEnumerable (Of String).

В каждой последующей итерации цикла For Each, среда выполнения продолжает из тела итератора, где он вышло, снова остановка при достижении оператора Yield. Цикл For Each завершается при достижении конца функции итератора или выписки Return или Exit Function.

Пример

В следующем примере два оператора Yield, внутри цикла For… Next. Каждая итерация тела выписки For Each в Main создает вызов функции Power итератора. Каждый вызов функции итератора переходит к следующему выполнения выписки Yield, которая происходит во время следующей итерации цикла For…Next.

Тип возвращаемого значения метода итератора IEnumerable тип интерфейса итератора. Если метод вызывается итератора, он возвращает перечислимый объект, содержащий степени числа.

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

См. также

Другие ресурсы

Итераторы (C# и Visual Basic)

Операторы (Visual Basic)