Compartilhar via


For each... Next demonstrativo (Visual Basic)

Repete um agrupar de instruções para cada elemento em uma coleção.

For Each element [ As datatype ] In group
    [ statements ]
    [ Exit For ]
    [ statements ]
Next [ element ]

Partes

  • element
    Necessária a For Each demonstrativo. Opcional no Next demonstrativo. Variável.Usado para iterar por meio dos elementos da coleção.

  • datatype
    Necessário se element não já foi declarado. Tipo de dados de element.

  • group
    Obrigatório.Variável de objeto.Se refere à coleção através do qual o statements está a ser repetido.

  • statements
    Opcional.Uma ou mais instruções entre For Each e Next executados em cada item group.

  • Exit For
    Opcional.Transfere controle fora do loop For Each.

  • Next
    Obrigatório.Termina a definição do loop For Each.

Comentários

Use um For Each... Next Faça um loop para repetir um conjunto de instruções para cada elemento de uma coleção ou matriz.

A For... Next demonstrativo (Visual Basic) funciona bem quando você pode associar cada iteração de um loop com uma variável de controle e determinar os valores de inicial e final dessa variável. No entanto, quando você está lidando com uma coleção, o conceito de valores iniciais e finais não é significativo e você não sabe necessariamente quantos elementos da coleção tem.Neste caso, um For Each... Next loop é uma opção melhor.

Regras

  • Tipos de dados O tipo de dados de element deve ser tal que o tipo de dados de elementos de group é possível converter a ele.

    O tipo de dados de group deve ser um tipo de referência que se refere a uma coleção ou uma matriz. Isso significa que group deve se referir a um objeto que implementa o IEnumerable interface dos System.Collections espaço para nome ou o IEnumerable<T> interface dos System.Collections.Generic espaço para nome. IEnumerable Define o GetEnumerator método, que retorna um objeto enumerador para a coleção. O objeto enumerador implementa o IEnumerator interface dos System.Collections namespace e expõe o Current propriedade e o Reset e MoveNext métodos. Visual Basic usa esses para percorrer a coleção.

    Os elementos de group geralmente são do tipo Object mas pode ter qualquer em time de execução tipo de dados.

  • Conversões de Estreitamento. Quando Option Strict é definido como On, conversões de restrição normalmente causam erros do compilador. No exemplo a seguir, a atribuição de m sistema autônomo o valor inicial para n não compila com Option Strict em porque a conversão de um Long para um Integer é uma conversão de restrição.

    Dim m As Long = 987
    ' Does not compile.
    'Dim n As Integer = m
    

    No entanto, as conversões de elementos em group para element são avaliados e executada em time de execução, e o erro de conversão de restrição é suprimido. No exemplo a seguir, nenhum erro de compilador é relatado no For Each loop, mesmo que ele requer a mesma conversão de Long para Integer que causou um erro no exemplo anterior.

    Option Strict On
    Module Module1
        Sub Main()
    
            ' The assignment of m to n causes a compiler error when 
            ' Option Strict is on.
            Dim m As Long = 987
            'Dim n As Integer = m
    
            ' The For Each loop requires the same conversion, but
            ' causes no errors. The output is 45 3 987.
            For Each p As Integer In New Long() {45, 3, 987}
                Console.Write(p & " ")
            Next
            Console.WriteLine()
        End Sub
    End Module
    
    

    A falta de um erro do compilador não elimina o risco de um em time de execução erro.No exemplo a seguir, nenhum erro de compilador é reportado, mas um em time de execução erro ocorre quando ToInteger é aplicada a 9876543210. O erro em time de execução ocorrerá se Option Strict está ativado ou desativado.

    Option Strict On
    
    Module Module1
        Sub Main()
    
            ' The assignment of m to n causes a compiler error when 
            ' Option Strict is on.
            Dim m As Long = 9876543210
            'Dim n As Integer = m
    
            Try
                ' The For Each loop requires the same conversion, but
                ' is not flagged by the compiler. A run-time error is 
                ' raised because 9876543210 is too large for type Integer.
                For Each p As Integer In New Long() {45, 3, 9876543210}
                    Console.Write(p & " ")
                Next
                Console.WriteLine()
            Catch e As System.OverflowException
                Console.WriteLine()
                Console.WriteLine(e.Message)
            End Try
        End Sub
    End Module
    
    
  • Declaração If element não foi declarada fora desse loop, você deverá declará-lo dentro do For Each demonstrativo. Você pode declarar o tipo de element explicitamente, usando um As demonstrativo, ou você pode confiar na inferência de tipos para atribuir o tipo. Em ambos os casos, o escopo de element é o corpo do loop. No entanto, você não pode declarar element ambos fora e dentro do loop.

  • Número de Iterações. Visual Basic é avaliada apenas uma vez, a coleção antes do início de loop.Se o seu bloco de instruções alterar element ou group, essas alterações não afetam a iteração do loop.

  • Loops Aninhados. Você pode aninhar loops For Each colocando um loop dentro de outro.No entanto, cada loop deve ter um exclusivo element variável.

    Você também pode aninhar diferentes tipos de estruturas de controle uma dentro da outra.Para obter mais informações, consulte Estruturas de controle aninhadas.

    Observação:

    Se um Next demonstrativo de um nível de aninhamento externo é encontrada antes de Next de um nível interno, o compilador indica um erro. No entanto, o compilador pode detectar essa sobreposição erro apenas se você especificar element em cada Next demonstrativo.

  • Identificando a variável de controle. Opcionalmente, você pode especificar element no Next demonstrativo. Isso melhora a legibilidade do seu programa, especialmente se você tiver aninhado For Each faz um loop. Você deve especificar a mesma variável sistema autônomo exibida no correspondente For Each demonstrativo.

  • Transferindo Fora do Loop O Declaração Saída (Visual Basic) transfere controle imediatamente para a declaração que segue a declaração Next.Você pode querer sair de um loop se você detectar uma condição que se faz desnecessária ou impossível de se continuar iterando, como um valor errôneo ou uma exigência de finalização.Além disso, se você capturar uma exceção em um Try... Catch... Finally demonstrativo, você pode usar Exit For no participante do Finally bloco.

    Você pode colocar qualquer número de Exit For instruções em qualquer lugar na For Each loop. Exit For geralmente é usado depois de avaliar algumas condições, por exemplo em um If... Then... Else estrutura.

  • Loops intermináveis. Um uso Exit For é testar uma condição que poderia causar um loop infinito, que é um loop que poderia executar um número extremamente grande ou até mesmo infinito de vezes.Se você detectar tal condição, você pode usar Exit For para escapar do loop.Para obter mais informações, consulte Declaração Do...Loop (Visual Basic).

Comportamento

  • Entrada para o loop. Quando a execução do For Each... Next loop começa, Visual Basic verifica se group refere-se a um objeto de coleção válido. Caso contrário, lança uma exceção.Caso contrário, ele chama o MoveNext método e o Current propriedade do objeto enumerador para retornar o primeiro elemento. If MoveNext indica que não há nenhum elemento seguinte, ou seja, se a coleção estiver vazia, o For Each loop é encerrado e controle passa para a seguinte demonstrativo de Next demonstrativo. Caso contrário, o Visual Basic define element para o primeiro elemento e executa a demonstrativo bloquear.

  • Iterações do loop. Sempre que o Visual Basic encontre o Next demonstrativo, ele retorna para o For Each demonstrativo. Novamente, ele chama MoveNext e Current para retornar o próximo elemento e novamente ou executa o bloco ou encerra o loop dependendo do resultado. Esse processo continua até MoveNext indica que não há nenhum elemento seguinte ou uma Exit For demonstrativo for encontrada.

  • Rescisão do loop. Quando todos os elementos da coleção tiverem sido atribuídos sucessivamente a element, o For Each loop é encerrado e controle passa para a seguinte demonstrativo de Next demonstrativo.

  • Alterando valores de iteração. Alterar o valor de element enquanto dentro de um loop pode tornar mais difícil de ler e depurar seu código. Alterar o valor de group não afeta a coleção ou seus elementos, que foram determinados quando o loop foi digitado pela primeira vez.

  • Ordem de passagem. Quando você executa um For Each... Next Travessia da coleção de loop, está sob o controle do objeto enumerador retornado pela GetEnumerator método. A ordem transversal não é determinada pelo Visual Basic, mas em vez pelo MoveNext método do objeto enumerador. Isso significa que você pode não ser capaz de prever qual elemento da coleção é o primeiro a ser retornado em element, ou que é a próxima a ser retornado após um determinado elemento.

    Se seu código depende de como percorrer um conjunto em uma determinada ordem, um For Each... Next loop não é a melhor opção, a menos que você conhecer as características do objeto enumerador de que coleção expõe. Você pode obter resultados mais confiáveis usando uma estrutura de loop diferentes, sistema autônomo For... Next ou Do... Loop.

  • Modificar a coleção. O objeto enumerador retornado por GetEnumerator normalmente não permite alterar a coleção adicionando, excluindo, substituindo ou reordenar os elementos. Se você alterar a coleção depois que você tenha iniciado um For Each... Next loop, o objeto enumerador se torna inválido e a próxima tentativa de acessar um elemento resultados em um InvalidOperationException exceção.

    No entanto, esse bloqueio de modificação não é determinado pelo Visual Basic, mas em vez pela implementação das IEnumerable interface. É possível implementar IEnumerable de forma a permitir a modificação durante a iteração. Se você estiver pensando em fazer essa modificação dinâmica, certifique-se de que entender as características do IEnumerable implementação na coleção que você está usando.

  • Modificando os elementos de coleção. The Current propriedade do objeto enumerador é ReadOnly (Visual Basic), e ela retorna uma cópia local de cada elemento da coleção. Isso significa que você não pode modificar os próprios elementos em um For Each... Next loop. Qualquer modificação que você fizer afeta somente a cópia local de Current e não será refletida de volta para a coleção subjacente. No entanto, se um elemento é um tipo de referência, você poderá modificar os membros de instância para o qual ele aponta.O exemplo a seguir ilustra isto:

    Sub lightBlueBackground(ByVal thisForm As System.Windows.Forms.Form)
        For Each thisControl As System.Windows.Forms.Control In thisForm.Controls
            thisControl.BackColor = System.Drawing.Color.LightBlue
        Next thisControl
    End Sub
    

    O exemplo anterior pode modificar o BackColor membro de cada thisControl elemento, embora ele não é possível modificar thisControl propriamente dito.

  • Desviar arrays. Porque o Array classe implementa a IEnumerable interface, todos os arrays exponham o GetEnumerator método. Isso significa que é possível iterar por meio de uma matriz com um For Each... Next loop. No entanto, você pode apenas ler os elementos da matriz, não alterá-los.Para obter uma ilustração, consulte Como: Executar várias instruções para cada elemento em uma coleção ou matriz.

Exemplo

O exemplo a seguir utiliza o For Each... Nextdemonstrativo para pesquisar todos os elementos em uma coleção para a seqüência de caracteres "Hello". O exemplo supõe que a coleção thisCollection já foi criado e que seus elementos são do tipo String.

Dim found As Boolean = False
Dim thisCollection As New Collection
For Each thisObject As String In thisCollection
    If thisObject = "Hello" Then
        found = True
        Exit For
    End If
Next thisObject

Consulte também

Tarefas

Como: Executar várias instruções para cada elemento em uma coleção ou matriz

Como: Melhore o desempenho de um loop

Conceitos

Estruturas de loop

Coleções em Visual Basic

Conversões Ampliadoras e Redutoras

Referência

While... participante While demonstrativo (Visual Basic)

Declaração Do...Loop (Visual Basic)

Date

History

Motivo

Julho de 2008

Seção adicional sobre restringir conversões.

Comentários do cliente.