Demonstração de rendimento (Visual Basic)
Envia o próximo elemento de uma coleção para uma For Each...Next
instrução.
Sintaxe
Yield expression
Parâmetros
Termo | Definição |
---|---|
expression |
Obrigatório. Uma expressão que é implicitamente conversível para o tipo da função iteradora ou Get acessador 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 iteradora ou Get
acessador, que executa iterações personalizadas em uma coleção.
Você consome uma função iteradora 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 a partir desse local na próxima vez que a função iterador for chamada.
Uma conversão implícita deve existir do tipo de na Yield
instrução para o tipo de expression
retorno do iterador.
Você pode usar uma Exit Function
instrução or para Return
encerrar a iteração.
"Rendimento" não é uma palavra reservada e tem significado especial apenas quando é usada em uma Iterator
função ou Get
acessório.
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 iteradora ou Get
acessador deve atender aos seguintes requisitos:
Ele deve incluir um modificador Iterator .
O tipo de retorno deve ser IEnumerable, IEnumerable<T>, IEnumerator, ou IEnumerator<T>.
Não pode ter parâmetros
ByRef
.
Uma função iteradora não pode ocorrer em um evento, construtor de instância, construtor estático ou destruidor estático.
Uma função iteradora pode ser uma função anônima. Para obter mais informações, consulte Iteradores.
Processamento de Exceções
Uma Yield
instrução pode estar dentro de um Try
bloco de um Try... Pegar... Finalmente Declaração. Um Try
bloco que tem uma Yield
instrução pode ter Catch
blocos e pode ter um Finally
bloco.
Uma Yield
instrução não pode estar dentro de um Catch
bloco ou de um Finally
bloco.
Se o For Each
corpo (fora da função iterador) lançar 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 iteradora captura apenas exceções que ocorrem dentro da função iterador.
Implementação Técnica
O código a seguir retorna uma IEnumerable (Of String)
função de iterador e, em seguida, itera através dos elementos do IEnumerable (Of String)
.
Dim elements As IEnumerable(Of String) = MyIteratorFunction()
…
For Each element As String In elements
Next
A chamada para MyIteratorFunction
não executa o corpo da função. Em vez disso, a chamada retorna um IEnumerable(Of String)
para a elements
variável.
Em uma iteração do For Each
loop, o MoveNext método é chamado para elements
. Esta chamada executa o corpo de MyIteratorFunction
até que a próxima Yield
instrução seja atingida. A Yield
instrução retorna uma expressão que determina não apenas o element
valor da variável para consumo pelo corpo do loop, mas também a Current propriedade dos elementos, que é um IEnumerable (Of String)
arquivo .
Em cada iteração subsequente do For Each
loop, a execução do corpo do iterador continua de onde parou, parando novamente quando atinge uma Yield
instrução. O For Each
loop é concluído quando o final da função iteradora ou de uma Return
instrução or Exit Function
é atingido.
Exemplo 1
O exemplo a seguir tem uma Yield
instrução que está dentro de um For... Próximo ciclo. Cada iteração do corpo da instrução For Each em Main
cria uma chamada para a Power
função iterador. Cada chamada para a função iterador prossegue para a Yield
próxima execução da 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 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.