Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Отправляет следующий элемент коллекции в инструкцию For Each...Next
.
Синтаксис
Yield expression
Параметры
Срок | Определение |
---|---|
expression |
Обязательное. Выражение, которое неявно преобразуется в тип функции итератора или Get метода доступа, содержащего инструкцию Yield . |
Замечания
Оператор Yield
возвращает один элемент коллекции одновременно. Инструкция Yield
включается в функцию итератора или Get
метод доступа, которая выполняет пользовательские итерации по коллекции.
Функция итератора используется с помощью элемента For Each... Следующая инструкция или запрос LINQ. Каждая итерация For Each
цикла вызывает функцию итератора.
Yield
Когда оператор достигается в функции итератора, возвращается, expression
а текущее расположение в коде сохраняется. Выполнение перезапускается из этого расположения при следующем вызове функции итератора.
Неявное преобразование должно существовать из типа expression
инструкции Yield
в тип возвращаемого типа итератора.
Для завершения итерации можно использовать Exit Function
инструкцию или Return
инструкцию.
"Доходность" не является зарезервированным словом и имеет особое значение только в том случае, если он используется в Iterator
функции или Get
методе доступа.
Дополнительные сведения о функциях итераторах и Get
методах доступа см. в разделе "Итераторы".
Функции итератора и получение методов доступа
Объявление функции итератора или Get
метода доступа должно соответствовать следующим требованиям:
Он должен включать модификатор итератора .
Возвращаемый тип должен быть IEnumerable, IEnumerable<T>IEnumeratorили IEnumerator<T>.
У него не может быть никаких
ByRef
параметров.
Функция итератора не может возникать в событии, конструкторе экземпляров, статического конструктора или статического деструктора.
Функция итератора может быть анонимной функцией. Дополнительные сведения см. в разделе Итераторы.
Обработка исключений.
Оператор Yield
может находиться в Try
блоке try... Ловить... Наконец, оператор. Блок 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
оператора.
Пример 1
В следующем примере есть Yield
инструкция, которая находится внутри for... Следующий цикл. Каждая итерация текста инструкции 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
Дополнительные примеры см. в разделе "Итераторы".