Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Envia o próximo elemento de uma coleção para uma For Each...Next instrução.
Sintaxe
Yield expression
Parâmetros
| Prazo | Definição |
|---|---|
expression |
Obrigatório Uma expressão que é implicitamente conversível para o tipo da função ou Get acessador do iterador que contém a Yield instrução. |
Observações
A Yield instrução retorna um elemento de uma coleção de cada vez. A Yield instrução é incluída em uma função de iterador ou Get acessador, que executa iterações personalizadas em uma coleção.
Você consome uma função de iterador usando um For Each... Próxima instrução ou uma consulta LINQ. Cada iteração do For Each loop chama a função iterador. Quando uma Yield instrução é alcançada na função iterador, expression é retornada e o local atual no código é mantido. A execução é reiniciada desse local na próxima vez que a função iterador for chamada.
Uma conversão implícita deve existir do tipo da expression instrução Yield para o tipo de retorno do iterador.
Você pode usar uma declaração Exit Function ou Return para encerrar a iteração.
"Rendimento" não é uma palavra reservada e tem um significado especial somente quando é usado em uma Iterator função ou Get acessador.
Para obter mais informações sobre funções de iterador e Get acessadores, consulte Iteradores.
Funções de iterador e obter acessadores
A declaração de uma função ou Get acessador de iterador deve atender aos seguintes requisitos:
Ele deve incluir um modificador do Iterador .
O tipo de retorno deve ser IEnumerable, IEnumerable<T>, IEnumeratorou IEnumerator<T>.
Ele não pode ter parâmetros
ByRef.
Uma função de iterador não pode ocorrer em um evento, construtor de instância, construtor estático ou destruidor estático.
Uma função de iterador pode ser uma função anônima. Para obter mais informações, consulte Iteradores.
Tratamento de exceção
Uma Yield instrução pode estar dentro de um Try bloco de um Try... Pegar... Instrução Finally. Um bloco Try que tem uma instrução Yield pode ter blocos Catch e pode ter um bloco Finally.
Uma Yield instrução não pode estar dentro de um bloco Catch ou de um bloco Finally.
Se o For Each corpo (fora da função iterador) gerar uma exceção, um Catch bloco na função iterador não será executado, mas um Finally bloco na função iterador será executado. Um Catch bloco dentro de uma função de iterador captura apenas exceções que ocorrem dentro da função iterador.
Implementação técnica
O código a IEnumerable (Of String)seguir retorna uma IEnumerable (Of String) função de iterador e, em seguida, itera pelos elementos do .
Dim elements As IEnumerable(Of String) = MyIteratorFunction()
…
For Each element As String In elements
Next
A chamada para MyIteratorFunction não executar o corpo da função. Em vez disso, a chamada retorna uma IEnumerable(Of String) para a elements variável.
Em uma iteração do For Each loop, o MoveNext método é chamado para elements. Essa chamada executa o corpo de MyIteratorFunction até que a próxima Yield instrução seja alcançada. A Yield instrução retorna uma expressão que determina não apenas o valor da element variável para consumo pelo corpo do loop, mas também a Current propriedade dos elementos, que é um IEnumerable (Of String).
Em cada iteração subsequente do For Each loop, a execução do corpo do iterador continua de onde parou, parando novamente quando atingir uma Yield instrução. O For Each loop é concluído quando o final da função iterador ou uma instrução ou Exit Function é Return atingido.
Exemplo 1
O exemplo a seguir tem uma Yield instrução que está dentro de um For... Próximo loop. Cada iteração do corpo da instrução Main cria uma chamada para a Power função iterador. Cada chamada para a função iterador prossegue para a próxima execução da Yield instrução, que ocorre durante a próxima iteração do For…Next loop.
O tipo de retorno do método iterador é IEnumerable<T>um tipo de interface de iterador. Quando o método iterador é chamado, ele retorna um objeto enumerável que contém os poderes de um número.
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
Exemplo 2
O exemplo a seguir demonstra um Get acessador que é um iterador. A declaração de propriedade inclui um Iterator modificador.
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
Para obter exemplos adicionais, consulte Iteradores.