Compartilhar via


Instrução Yield (Visual Basic)

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:

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.

Consulte também