Estruturas de controle aninhadas (Visual Basic)

Você pode colocar instruções de controle dentro de outras instruções de controle, por exemplo, um bloco If...Then...Else dentro de um loop For...Next. Uma instrução de controle colocada dentro de outra instrução de controle é considerada aninhada.

Níveis de Aninhamento

As estruturas de controle no Visual Basic podem ser aninhadas para quantos níveis desejar. É prática comum tornar as estruturas aninhadas mais legíveis recuando o corpo de cada uma delas. O editor do IDE (ambiente de desenvolvimento integrado) faz isso automaticamente.

No exemplo a seguir, o procedimento sumRows adiciona os elementos positivos de cada linha da matriz.

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 interno For e a última instrução Next fecha o loop externo For.

Da mesma forma, em instruções aninhadas If, as instruções End If se aplicam automaticamente à instrução If anterior mais próxima. Os loops aninhados Do funcionam de maneira semelhante, com a instrução Loop mais interna correspondendo à instrução Do mais interna.

Observação

Para muitas estruturas de controle, quando você clica em uma palavra-chave, todas as palavras-chave na estrutura são realçadas. Por exemplo, quando você clica If em uma construção If...Then...Else, todas as instâncias de If, Then, ElseIf, Else e End If na construção são realçadas. Para passar para a próxima palavra-chave realçada ou para a anterior, pressione CTRL+SHIFT+SETA PARA BAIXO ou CTRL+SHIFT+SETA PARA CIMA.

Aninhando Diferentes Tipos de Estruturas de Controle

Você pode aninhar um tipo de estrutura de controle dentro de outro tipo. O exemplo a seguir usa um bloco With dentro de um loop For Each e blocos If aninhados dentro do blocoWith.

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  

Estruturas de Controle Sobrepostas

Não é possível sobrepor estruturas de controle. Isso significa que qualquer estrutura aninhada precisa estar completamente contida na próxima estrutura interna. Por exemplo, a disposição a seguir é inválida porque o loop For termina antes que o bloco With interno seja encerrado.

Diagram that shows an example of invalid nesting.

O compilador do Visual Basic detecta essas estruturas de controle sobrepostas e sinaliza um erro em tempo de compilação.

Confira também