Istruzione For...Next (Visual Basic)

Consentono di ripetere un gruppo di istruzioni per il numero di volte specificato.

For counter [ As datatype ] = start To end [ Step step ]
    [ statements ]
    [ Continue For ]
    [ statements ]
    [ Exit For ]
    [ statements ]
Next [ counter ]

Parti

Parte

Descrizione

counter

Obbligatorio nell'istruzione For.Variabile numerica.Variabile di controllo disponibile per il ciclo.Per ulteriori informazioni, vedere Argomento Counter più avanti in questo argomento.

datatype

Opzionale.Tipo di dati di counter.Per ulteriori informazioni, vedere Argomento Counter più avanti in questo argomento.

start

Necessario.Espressione numerica.Valore iniziale di counter.

end

Necessario.Espressione numerica.Valore finale di counter.

step

Opzionale.Espressione numerica.Valore dell'incremento di counter a ogni iterazione del ciclo.

statements

Opzionale.Una o più istruzioni inserite tra For e Next ed eseguite per il numero di volte specificato.

Continue For

Opzionale.Consente di trasferire il controllo all'iterazione del ciclo successiva.

Exit For

Opzionale.Trasferisce il controllo all'esterno del ciclo For.

Next

Necessario.Termina la definizione del ciclo For.

[!NOTA]

La parola chiave di To viene utilizzata in questa istruzione per specificare l'intervallo per il contatore.È inoltre possibile utilizzare la parola chiave in Istruzione Select...Case (Visual Basic) e nelle dichiarazioni di matrice.Per ulteriori informazioni sulle dichiarazioni di matrice, vedere Istruzione Dim (Visual Basic).

Esempi semplici

Utilizzare una struttura di For…Next quando si desidera riprodurre un insieme di istruzioni per il numero di volte specificato.

Nell'esempio seguente, la variabile di index inizia con un valore di 1 e viene incrementata a ogni iterazione del ciclo, terminando dopo che il valore di intervalli di 5. index.

For index As Integer = 1 To 5
    Debug.Write(index.ToString & " ")
Next
Debug.WriteLine("")
' Output: 1 2 3 4 5

Nell'esempio seguente, la variabile di number inizia a 2 e viene ridotta di 0,25 per ogni iterazione del ciclo, terminando dopo che il valore di 0 intervalli di number.L'argomento di Step di -.25 ridurre il valore di 0,25 per ogni iterazione del ciclo.

For number As Double = 2 To 0 Step -0.25
    Debug.Write(number.ToString & " ")
Next
Debug.WriteLine("")
' Output: 2 1.75 1.5 1.25 1 0.75 0.5 0.25 0 
SuggerimentoSuggerimento

Funzionamento di Istruzione Do...Loop (Visual Basic) o di Istruzione While...End While (Visual Basic) scaturiscono quando non si conosce in anticipo quante volte per eseguire le istruzioni del ciclo.Se invece si prevede di eseguire il ciclo per un numero specifico di volte, si consiglia di utilizzare For...Next.Il numero di iterazioni viene definito la prima volta che si entra nel ciclo.

Cicli annidati

È possibile annidare cicli For inserendo un ciclo all'interno dell'altro.Nell'esempio seguente vengono illustrate le strutture For...Next annidate con diversi valori di incremento.Il ciclo esterno consente di creare una stringa per ogni iterazione del ciclo.Nel ciclo interno, per ogni iterazione del ciclo viene ridotta una variabile del contatore di cicli.

For indexA = 1 To 3
    ' Create a new StringBuilder, which is used
    ' to efficiently build strings.
    Dim sb As New System.Text.StringBuilder()

    ' Append to the StringBuilder every third number
    ' from 20 to 1 descending.
    For indexB = 20 To 1 Step -3
        sb.Append(indexB.ToString)
        sb.Append(" ")
    Next indexB

    ' Display the line.
    Debug.WriteLine(sb.ToString)
Next indexA
' Output:
'  20 17 14 11 8 5 2
'  20 17 14 11 8 5 2
'  20 17 14 11 8 5 2

Quando i cicli di annidamento, ogni ciclo deve essere una variabile univoca di counter.

È inoltre possibile annidare strutture di controllo di tipo diverso inserendole una all'interno dell'altra.Per ulteriori informazioni, vedere Strutture di controllo annidate (Visual Basic).

L'uscita per e continua per

L'istruzione di Exit For immediatamente chiude il ciclo di For…Next e il trasferisce il controllo all'istruzione che segue l'istruzione di Next.

Tramite l'istruzione Continue For il controllo viene trasferito immediatamente alla successiva iterazione del ciclo.Per ulteriori informazioni, vedere Istruzione Continue (Visual Basic).

Nell'esempio riportato di seguito viene illustrato l'utilizzo delle istruzioni Continue For e Exit For.

For index As Integer = 1 To 100000
    ' If index is between 5 and 7, continue
    ' with the next iteration.
    If index >= 5 And index <= 8 Then
        Continue For
    End If

    ' Display the index.
    Debug.Write(index.ToString & " ")

    ' If index is 10, exit the loop.
    If index = 10 Then
        Exit For
    End If
Next
Debug.WriteLine("")
' Output: 1 2 3 4 9 10

È possibile inserire un numero illimitato di istruzioni Exit For in un ciclo For…Next.Se utilizzata all'interno di cicli For…Next annidati, l'istruzione Exit For consente l'uscita dal ciclo più interno e il trasferimento del controllo al livello di annidamento successivo superiore.

Exit For viene spesso utilizzato dopo la valutazione di una determinata condizione, ad esempio in una struttura di If…Then…Else ).Si potrebbe decidere di utilizzare il controllo Exit For per le seguenti condizioni:

  • La continuazione dell'iterazione non è necessaria oppure è impossibile.Un valore errato o una richiesta di chiusura potrebbe creare tale condizione.

  • Un'istruzione di Try…Catch…Finally intercetta un'eccezione.È possibile utilizzare Exit For alla fine del blocco Finally.

  • È un ciclo infinito, un ciclo che esegua un grande o addirittura numero di volte infinito.Se si rileva una simile condizione, è possibile utilizzare Exit For per interrompere l'esecuzione del ciclo.Per ulteriori informazioni, vedere Istruzione Do...Loop (Visual Basic).

Implementazione tecnica

Quando viene avviato un ciclo For...Next, in Visual Basic vengono restituiti start, end e step.Visual Basic valuta questi valori solo attualmente e quindi assegnato start a counter.Prima che il blocco di istruzioni funzioni, Visual Basic e counter a end.Se counter è ancora maggiore del valore di end o più piccolo se step è negativo), il ciclo di For termina e il controllo passa all'istruzione che segue l'istruzione di Next.In caso contrario, il blocco di istruzioni viene eseguito.

Ogni volta che Visual Basic incontra l'istruzione Next, incrementa il valore di counter di step e torna all'istruzione For.La variabile counter viene nuovamente confrontata con il valore end e in base al risultato viene eseguito di nuovo il blocco oppure viene effettuata l'uscita dal ciclo.Il processo continua finché counter non passa end oppure non si raggiunge un'istruzione Exit For.

Il ciclo non si interrompe finché counter non ha passato end.Se counter è uguale a end, il ciclo continua.Il confronto che determina se eseguire il blocco è counter <=end se step è positivo e counter >= end se step è negativo.

Se si modifica il valore di counter mentre in un ciclo, il codice può essere più difficile da leggere e debug.Modificando il valore di start, end, o step non influisce sui valori di iterazione che siano stati determinati quando il ciclo viene immesso.

Se annidate i cicli, il compilatore segnala un errore se rileva l'istruzione di Next di un livello di annidamento esterno prima dell'istruzione di Next di un livello interno.Tuttavia, il compilatore può rilevare questo errore di sovrapposizione solo se si specifica counter in ogni istruzione Next.

5z06z1kb.collapse_all(it-it,VS.110).gifArgomento step

Dal valore di step, che può essere positivo o negativo,Questo parametro consente l'elaborazione del ciclo nella seguente tabella:

Valore di Step

Il ciclo verrà eseguito se

Positivo o zero

counter <= end

Negativo

counter >= end

Il valore predefinito di step è 1.

5z06z1kb.collapse_all(it-it,VS.110).gifArgomento Counter

La tabella riportata di seguito indica se counter definisce una nuova variabile locale limitata all'intero ciclo di For…Next.Questa scelta dipende da datatype è presente e se counter è già definito.

È datatype presente?

counter è già definito?

Risultato (se counter definisce una nuova variabile locale limitata all'intero ciclo di For...Next )

No

No, perché counter è già definito.Se l'ambito di counter non è locale alla routine, un avviso in fase di compilazione si verifica.

No

No

Sì.Il tipo di dati viene dedotto da start, da ende da espressioni di step.Per informazioni sull'inferenza del tipo, vedere Istruzione Option Infer e Inferenza del tipo di variabile locale (Visual Basic).

Sì, ma solo se la variabile esistente di counter è definita all'esterno della routine.La variabile rimane separata.Se l'ambito di una variabile esistente di counter è locale alla routine, un errore in fase di compilazione si verifica.

No

Sì.

Il tipo di dati di counter determina il tipo dell'iterazione, che deve essere uno dei seguenti tipi:

  • Oggetto Byte, SByte, UShort, Short, UInteger, Integer, ULong, Long, Decimal, Single o Double.

  • Enumerazione che viene dichiarata tramite un'Istruzione Enum (Visual Basic).

  • Oggetto Object.

  • Tipo T che dispone dei seguenti operatori, dove B è un tipo che può essere utilizzato in un'espressione Boolean.

    Public Shared Operator >= (op1 As T, op2 As T) As B

    Public Shared Operator <= (op1 As T, op2 As T) As B

    Public Shared Operator - (op1 As T, op2 As T) As T

    Public Shared Operator + (op1 As T, op2 As T) As T

È possibile specificare la variabile di counter nell'istruzione di Next.Questa sintassi consente di migliorare la leggibilità del programma, specialmente se sono presenti cicli annidati di di For.È necessario specificare la variabile visualizzato nell'istruzione corrispondente di For.

Tramite le espressioni start, end e step è possibile restituire qualsiasi tipo di dati ampliabile al tipo di counter.Se si utilizza un tipo definito per counter, potrebbe essere necessario definire l'operatore di conversione di CType per convertire i tipi di start, di end, o di step al tipo di counter.

Esempio

Nell'esempio seguente vengono rimossi tutti gli elementi da un elenco generico.Anziché Istruzione For Each...Next (Visual Basic), nell'esempio viene illustrata un'istruzione di For…Next che scorre in ordine decrescente.L'esempio utilizza questa tecnica perché il metodo di removeAt determina gli elementi dopo l'elemento rimosso a un valore di indice più basso.

Dim lst As New List(Of Integer) From {10, 20, 30, 40}

For index As Integer = lst.Count - 1 To 0 Step -1
    lst.RemoveAt(index)
Next

Debug.WriteLine(lst.Count.ToString)
' Output: 0

L'esempio seguente consente di scorrere un'enumerazione che viene dichiarata utilizzando Istruzione Enum (Visual Basic).

Public Enum Mammals
    Buffalo
    Gazelle
    Mongoose
    Rhinoceros
    Whale
End Enum


Public Sub ListSomeMammals()
    For mammal As Mammals = Mammals.Gazelle To Mammals.Rhinoceros
        Debug.Write(mammal.ToString & " ")
    Next
    Debug.WriteLine("")
    ' Output: Gazelle Mongoose Rhinoceros
End Sub

Nell'esempio seguente, la classe dei parametri dell'istruzione dispone di overload degli operatori per gli operatori +, -, >= e <=.

Private Class Distance
    Public Property Number() As Double

    Public Sub New(ByVal number As Double)
        Me.Number = number
    End Sub

    ' Define operator overloads to support For...Next statements.
    Public Shared Operator +(ByVal op1 As Distance, ByVal op2 As Distance) As Distance
        Return New Distance(op1.Number + op2.Number)
    End Operator

    Public Shared Operator -(ByVal op1 As Distance, ByVal op2 As Distance) As Distance
        Return New Distance(op1.Number - op2.Number)
    End Operator

    Public Shared Operator >=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean
        Return (op1.Number >= op2.Number)
    End Operator

    Public Shared Operator <=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean
        Return (op1.Number <= op2.Number)
    End Operator
End Class


Public Sub ListDistances()
    Dim distFrom As New Distance(10)
    Dim distTo As New Distance(25)
    Dim distStep As New Distance(4)

    For dist As Distance = distFrom To distTo Step distStep
        Debug.Write(dist.Number.ToString & " ")
    Next
    Debug.WriteLine("")

    ' Output: 10 14 18 22 
End Sub

Vedere anche

Riferimenti

Istruzione While...End While (Visual Basic)

Istruzione Do...Loop (Visual Basic)

Istruzione Exit (Visual Basic)

List<T>

Concetti

Strutture di ciclo (Visual Basic)

Strutture di controllo annidate (Visual Basic)

Altre risorse

Raccolte (C# e Visual Basic)