Estruturas de controle aninhadas (Visual Basic)Nested Control Structures (Visual Basic)

Você pode posicionar instruções de controle dentro de outras instruções de controle, por exemplo um bloco de If...Then...Else em um loop de For...Next.You can place control statements inside other control statements, for example an If...Then...Else block within a For...Next loop. Uma instrução de controle colocada dentro de outra instrução de controle é considerada aninhada.A control statement placed inside another control statement is said to be nested.

Níveis de aninhamentoNesting Levels

As estruturas de controle no Visual Basic podem ser aninhadas para quantos níveis você desejar.Control structures in Visual Basic can be nested to as many levels as you want. É uma prática comum tornar as estruturas aninhadas mais legíveis recuando o corpo de cada uma.It is common practice to make nested structures more readable by indenting the body of each one. O editor de ambiente de desenvolvimento integrado (IDE) faz isso automaticamente.The integrated development environment (IDE) editor automatically does this.

No exemplo a seguir, o procedimento sumRows adiciona os elementos positivos de cada linha da matriz.In the following example, the procedure sumRows adds together the positive elements of each row of the matrix.

Public Sub sumRows(ByVal a(,) As Double, ByRef r() As Double)  
    Dim i, j As Integer  
    For i = 0 To UBound(a, 1)  
        r(i) = 0  
        For j = 0 To UBound(a, 2)  
            If a(i, j) > 0 Then  
                r(i) = r(i) + a(i, j)  
            End If  
        Next j  
    Next i  
End Sub  

No exemplo anterior, a primeira instrução Next fecha o loop de For interno e a última instrução Next fecha o loop de For externo.In the preceding example, the first Next statement closes the inner For loop and the last Next statement closes the outer For loop.

Da mesma forma, em instruções aninhadas de If, as instruções de End If se aplicam automaticamente à instrução de If anterior mais próxima.Likewise, in nested If statements, the End If statements automatically apply to the nearest prior If statement. Loops de Do aninhados funcionam de maneira semelhante, com a instrução de Loop mais interna correspondente à instrução de Do mais interna.Nested Do loops work in a similar fashion, with the innermost Loop statement matching the innermost Do statement.

Observação

Para muitas estruturas de controle, quando você clica em uma palavra-chave, todas as palavras-chave na estrutura são realçadas.For many control structures, when you click a keyword, all of the keywords in the structure are highlighted. Por exemplo, quando você clica em If em uma construção de If...Then...Else, todas as instâncias de If, Then, ElseIf, Elsee End If na construção são realçadas.For instance, when you click If in an If...Then...Else construction, all instances of If, Then, ElseIf, Else, and End If in the construction are highlighted. Para mover para a próxima palavra-chave realçada ou anterior, pressione CTRL + SHIFT + seta para baixo ou CTRL + SHIFT + seta para cima.To move to the next or previous highlighted keyword, press CTRL+SHIFT+DOWN ARROW or CTRL+SHIFT+UP ARROW.

Aninhando diferentes tipos de estruturas de controleNesting Different Kinds of Control Structures

Você pode aninhar um tipo de estrutura de controle dentro de outro tipo.You can nest one kind of control structure within another kind. O exemplo a seguir usa um bloco de With dentro de um loop de For Each e blocos de If aninhados dentro do bloco de With.The following example uses a With block inside a For Each loop and nested If blocks inside the With block.

For Each ctl As System.Windows.Forms.Control In Me.Controls  
    With ctl  
        .BackColor = System.Drawing.Color.Yellow  
        .ForeColor = System.Drawing.Color.Black  
        If .CanFocus Then  
            .Text = "Colors changed"  
            If Not .Focus() Then  
                ' Insert code to process failed focus.  
            End If  
        End If  
    End With  
Next ctl  

Sobrepondo estruturas de controleOverlapping Control Structures

Não é possível sobrepor estruturas de controle.You cannot overlap control structures. Isso significa que qualquer estrutura aninhada deve estar completamente contida na próxima estrutura mais interna.This means that any nested structure must be completely contained within the next innermost structure. Por exemplo, a organização a seguir é inválida porque o loop de For termina antes de o bloco de With interno ser encerrado.For example, the following arrangement is invalid because the For loop terminates before the inner With block terminates.

Diagrama que mostra um exemplo de aninhamento inválido.

O compilador Visual Basic detecta essas estruturas de controle sobrepostas e sinaliza um erro em tempo de compilação.The Visual Basic compiler detects such overlapping control structures and signals a compile-time error.

Consulte tambémSee also