Оператор 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 должно отвечать следующим требованиям.
Он должен включать модификатор Итератор.
Возвращаемый тип должен быть IEnumerable, IEnumerable<T>, IEnumerator или IEnumerator<T>.
Он не может содержать параметры ByRef.
Функция итератора, не может содержаться в событии, конструкторе экземпляра, статическим конструктором, или статическом деструкторе.
Функция итератора может быть анонимной функции.Для получения дополнительной информации см. Итераторы (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<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