Strutture di controllo annidate (Visual Basic)

È possibile inserire istruzioni di controllo all'interno di altre istruzioni di controllo, ad esempio un blocco If...Then...Else all'interno di un ciclo For...Next. Un'istruzione di controllo inserita all'interno di un'altra istruzione di controllo viene considerata annidata.

Livelli di annidamento

Le strutture di controllo in Visual Basic possono essere annidate nel numero desiderato di livelli. È pratica comune rendere le strutture annidate più leggibili impostando il rientro del corpo di ognuna. L'editor IDE (Integrated Development Environment) esegue automaticamente questa operazione.

Nell'esempio seguente la routine sumRows raggruppa gli elementi positivi di ogni riga della matrice.

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  

Nell'esempio precedente la prima istruzione Next chiude il ciclo interno For e l'ultima istruzione Next chiude il ciclo esterno For.

Analogamente, nelle istruzioni annidate If, le istruzioni End If si applicano automaticamente all'istruzione If precedente più vicina. I cicli Do annidati funzionano in modo simile, con l'istruzione Loop più interna corrispondente all'istruzione Do più interna.

Nota

Per molte strutture di controllo, quando si fa clic su una parola chiave, vengono evidenziate tutte le parole chiave nella struttura. Ad esempio, quando si fa clic su If in un costrutto If...Then...Else, vengono evidenziate tutte le istanze di If, Then, ElseIf, Else e End If. Per passare alla parola chiave evidenziata successiva o precedente, premere CTRL+MAIUSC+ FRECCIA GIÙ o CTRL+MAIUSC+FRECCIA SU.

Annidamento di tipi diversi di strutture di controllo

È possibile annidare un tipo di struttura di controllo all'interno di un altro tipo. L'esempio seguente usa un blocco With all'interno di un ciclo For Each e i blocchi annidati If all'interno del blocco With.

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  

Sovrapposizione di strutture di controllo

Non è possibile sovrapporre le strutture di controllo. Ciò significa che qualsiasi struttura nidificata deve essere completamente contenuta all'interno della struttura successiva più interna. Ad esempio, la disposizione seguente non è valida perché il ciclo For termina prima del termine del blocco interno With.

Diagram that shows an example of invalid nesting.

Il compilatore di Visual Basic rileva strutture di controllo sovrapposte e segnala un errore in fase di compilazione.

Vedi anche