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:

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.

Consulte também