Istruzione For...Next (Visual Basic)For...Next Statement (Visual Basic)

Ripete un gruppo di istruzioni per un numero di volte specificato.Repeats a group of statements a specified number of times.

SintassiSyntax

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

PartiParts

PartePart DescrizioneDescription
counter Obbligatorio nell' For istruzione.Required in the For statement. Variabile numerica.Numeric variable. Variabile di controllo per il ciclo.The control variable for the loop. Per ulteriori informazioni, vedere argomento Counter più avanti in questo argomento.For more information, see Counter Argument later in this topic.
datatype facoltativo.Optional. Tipo di dati di counter .Data type of counter. Per ulteriori informazioni, vedere argomento Counter più avanti in questo argomento.For more information, see Counter Argument later in this topic.
start Obbligatorio.Required. Espressione numerica.Numeric expression. Il valore iniziale di counter.The initial value of counter.
end Obbligatorio.Required. Espressione numerica.Numeric expression. Valore finale di counter .The final value of counter.
step facoltativo.Optional. Espressione numerica.Numeric expression. Importo in base al quale counter viene incrementato ogni volta nel ciclo.The amount by which counter is incremented each time through the loop.
statements facoltativo.Optional. Una o più istruzioni tra For e Next che eseguono il numero di volte specificato.One or more statements between For and Next that run the specified number of times.
Continue For facoltativo.Optional. Trasferisce il controllo alla successiva iterazione del ciclo.Transfers control to the next loop iteration.
Exit For facoltativo.Optional. Trasferisce il controllo all'esterno del For ciclo.Transfers control out of the For loop.
Next Obbligatorio.Required. Termina la definizione del For ciclo.Terminates the definition of the For loop.

Nota

La To parola chiave viene utilizzata in questa istruzione per specificare l'intervallo per il contatore.The To keyword is used in this statement to specify the range for the counter. È anche possibile usare questa parola chiave nell'oggetto Select... Istruzione case e nelle dichiarazioni di matrici.You can also use this keyword in the Select...Case Statement and in array declarations. Per ulteriori informazioni sulle dichiarazioni di matrici, vedere istruzione Dim.For more information about array declarations, see Dim Statement.

Semplici esempiSimple Examples

Utilizzare una For struttura... Next quando si desidera ripetere un set di istruzioni per un numero di volte.You use a For...Next structure when you want to repeat a set of statements a set number of times.

Nell'esempio seguente, la index variabile inizia con un valore pari a 1 e viene incrementata a ogni iterazione del ciclo, terminando dopo il valore di index raggiunge 5.In the following example, the index variable starts with a value of 1 and is incremented with each iteration of the loop, ending after the value of index reaches 5.

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

Nell'esempio seguente, la number variabile inizia da 2 e viene ridotta di 0,25 in ogni iterazione del ciclo, terminando dopo il valore di number raggiunge 0.In the following example, the number variable starts at 2 and is reduced by 0.25 on each iteration of the loop, ending after the value of number reaches 0. L' Step argomento di -.25 riduce il valore di 0,25 a ogni iterazione del ciclo.The Step argument of -.25 reduces the value by 0.25 on each iteration of the loop.

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 

Suggerimento

Un po'... Istruzione End While o do... L'istruzione Loop funziona bene se non si conosce in anticipo il numero di volte in cui eseguire le istruzioni nel ciclo.A While...End While Statement or Do...Loop Statement works well when you don't know in advance how many times to run the statements in the loop. Tuttavia, quando si prevede di eseguire il ciclo un numero specifico di volte, un For ciclo... Next rappresenta una scelta migliore.However, when you expect to run the loop a specific number of times, a For...Next loop is a better choice. Il numero di iterazioni viene determinato quando si immette il ciclo per la prima volta.You determine the number of iterations when you first enter the loop.

Annidamento di cicliNesting Loops

È possibile annidare For cicli inserendo un ciclo all'interno di un altro.You can nest For loops by putting one loop within another. Nell'esempio seguente vengono illustrate le strutture annidate con For Next valori di passaggio diversi.The following example demonstrates nested For...Next structures that have different step values. Il ciclo esterno crea una stringa per ogni iterazione del ciclo.The outer loop creates a string for every iteration of the loop. Il ciclo interno decrementa una variabile del contatore di cicli per ogni iterazione del ciclo.The inner loop decrements a loop counter variable for every iteration of the loop.

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 si annidano cicli, ogni ciclo deve avere una counter variabile univoca.When nesting loops, each loop must have a unique counter variable.

È anche possibile annidare strutture di controllo di tipi diversi l'una all'altra.You can also nest different kinds control structures within each other. Per altre informazioni, vedere strutture di controlli annidati.For more information, see Nested Control Structures.

Esci per e continua perExit For and Continue For

L' Exit For istruzione esce immediatamente da For ...NextThe Exit For statement immediately exits the ForNext esegue il ciclo e trasferisce il controllo all'istruzione che segue l' Next istruzione.loop and transfers control to the statement that follows the Next statement.

L' Continue For istruzione trasferisce immediatamente il controllo all'iterazione successiva del ciclo.The Continue For statement transfers control immediately to the next iteration of the loop. Per ulteriori informazioni, vedere istruzione continue.For more information, see Continue Statement.

Nell'esempio seguente viene illustrato l'utilizzo delle Continue For istruzioni e Exit For .The following example illustrates the use of the Continue For and Exit For statements.

For index As Integer = 1 To 100000
    ' If index is between 5 and 7, continue
    ' with the next iteration.
    If index >= 5 AndAlso 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 qualsiasi di Exit For istruzioni in un For ...NextYou can put any number of Exit For statements in a ForNext loop.loop. Se utilizzato all'interno di For ...NextWhen used within nested ForNext esegue il loop, Exit For esce dal ciclo più interno e trasferisce il controllo al successivo livello di nidificazione.loops, Exit For exits the innermost loop and transfers control to the next higher level of nesting.

Exit For viene spesso usato dopo la valutazione di una condizione, ad esempio in un If ... Then ...Else struttura).Exit For is often used after you evaluate some condition (for example, in an If...Then...Else structure). Può essere utile usare Exit For per le condizioni seguenti:You might want to use Exit For for the following conditions:

  • La continuazione dell'iterazione non è necessaria o impossibile.Continuing to iterate is unnecessary or impossible. Questa condizione può essere creata da un valore errato o da una richiesta di terminazione.An erroneous value or a termination request might create this condition.

  • A Try ... Catch ...Finally l'istruzione rileva un'eccezione.A Try...Catch...Finally statement catches an exception. È possibile utilizzare Exit For alla fine del Finally blocco.You might use Exit For at the end of the Finally block.

  • Si dispone di un ciclo infinito, ovvero un ciclo che può eseguire un numero di volte elevato o addirittura infinito.You have an endless loop, which is a loop that could run a large or even infinite number of times. Se si rileva una condizione di questo tipo, è possibile utilizzare Exit For per eseguire l'escape del ciclo.If you detect such a condition, you can use Exit For to escape the loop. Per ulteriori informazioni, vedere ... Istruzione Loop.For more information, see Do...Loop Statement.

Implementazione tecnicaTechnical Implementation

Quando For viene avviato un ciclo... Next , Visual Basic valuta start , end e step .When a For...Next loop starts, Visual Basic evaluates start, end, and step. Visual Basic valuta questi valori solo in questo momento e quindi assegna start a counter .Visual Basic evaluates these values only at this time and then assigns start to counter. Prima dell'esecuzione del blocco di istruzioni, Visual Basic viene confrontato counter con end .Before the statement block runs, Visual Basic compares counter to end. Se counter è già maggiore del end valore (o minore se step è negativo), il For ciclo termina e il controllo passa all'istruzione che segue l' Next istruzione.If counter is already larger than the end value (or smaller if step is negative), the For loop ends and control passes to the statement that follows the Next statement. In caso contrario, viene eseguito il blocco di istruzioni.Otherwise, the statement block runs.

Ogni volta che Visual Basic rileva l' Next istruzione, viene incrementato counter di e viene step restituito all' For istruzione.Each time Visual Basic encounters the Next statement, it increments counter by step and returns to the For statement. Anche in questo caso viene confrontato counter con end e di nuovo esegue il blocco o esce dal ciclo, a seconda del risultato.Again it compares counter to end, and again it either runs the block or exits the loop, depending on the result. Questo processo continua fino a quando non counter end Exit For vengono rilevati i passaggi o un'istruzione.This process continues until counter passes end or an Exit For statement is encountered.

Il ciclo non viene arrestato fino a quando non counter viene superato end .The loop doesn't stop until counter has passed end. Se counter è uguale a end , il ciclo continua.If counter is equal to end, the loop continues. Il confronto che determina se eseguire il blocco è counter <= end se step è positivo e counter >= end se step è negativo.The comparison that determines whether to run the block is counter <= end if step is positive and counter >= end if step is negative.

Se si modifica il valore di counter all'interno di un ciclo, il codice potrebbe essere più difficile da leggere ed eseguire il debug.If you change the value of counter while inside a loop, your code might be more difficult to read and debug. La modifica del valore di start , end o step non influisce sui valori di iterazione che sono stati determinati quando il ciclo è stato immesso per la prima volta.Changing the value of start, end, or step doesn't affect the iteration values that were determined when the loop was first entered.

Se si annidano i cicli, il compilatore segnala un errore se rileva l' Next istruzione di un livello di nidificazione esterno prima dell' Next istruzione di un livello interno.If you nest loops, the compiler signals an error if it encounters the Next statement of an outer nesting level before the Next statement of an inner level. Tuttavia, il compilatore può rilevare questo errore di sovrapposizione solo se si specifica counter in ogni Next istruzione.However, the compiler can detect this overlapping error only if you specify counter in every Next statement.

Argomento StepStep Argument

Il valore di step può essere positivo o negativo.The value of step can be either positive or negative. Questo parametro determina l'elaborazione del ciclo in base alla tabella seguente:This parameter determines loop processing according to the following table:

Valore passaggioStep value Il ciclo viene eseguito seLoop executes if
Positivo o zeroPositive or zero counter <= end
NegativoNegative counter >= end

Il valore predefinito di step è 1.The default value of step is 1.

Argomento contatoreCounter Argument

La tabella seguente indica se counter definisce una nuova variabile locale con ambito per l'intero For…Next ciclo.The following table indicates whether counter defines a new local variable that’s scoped to the entire For…Next loop. Questa decisione dipende dal fatto che datatype sia presente e che sia counter già definito.This determination depends on whether datatype is present and whether counter is already defined.

È datatype presente?Is datatype present? È counter già definito?Is counter already defined? Risultato (se counter definisce una nuova variabile locale con ambito per l'intero For...Next ciclo)Result (whether counter defines a new local variable that’s scoped to the entire For...Next loop)
NoNo Yes No, perché counter è già definito.No, because counter is already defined. Se l'ambito di counter non è locale alla routine, viene generato un avviso in fase di compilazione.If the scope of counter isn't local to the procedure, a compile-time warning occurs.
NoNo NoNo Sì.Yes. Il tipo di dati viene dedotto dalle start espressioni, end e step .The data type is inferred from the start, end, and step expressions. Per informazioni sull'inferenza del tipo, vedere istruzione Option deduce e inferenza del tipo locale.For information about type inference, see Option Infer Statement and Local Type Inference.
Yes Yes Sì, ma solo se la counter variabile esistente è definita all'esterno della routine.Yes, but only if the existing counter variable is defined outside the procedure. Tale variabile rimane separata.That variable remains separate. Se l'ambito della variabile esistente counter è locale alla procedura, si verificherà un errore in fase di compilazione.If the scope of the existing counter variable is local to the procedure, a compile-time error occurs.
Yes NoNo Sì.Yes.

Il tipo di dati di counter determina il tipo di iterazione, che deve essere uno dei tipi seguenti:The data type of counter determines the type of the iteration, which must be one of the following types:

  • Byte,, SByte , UShort Short , UInteger , Integer , ULong , Long , Decimal , Single O Double .A Byte, SByte, UShort, Short, UInteger, Integer, ULong, Long, Decimal, Single, or Double.

  • Enumerazione dichiarata tramite un' istruzione enum.An enumeration that you declare by using an Enum Statement.

  • Oggetto Object.An Object.

  • Tipo T che dispone degli operatori seguenti, dove B è un tipo che può essere utilizzato in un' Boolean espressione.A type T that has the following operators, where B is a type that can be used in a Boolean expression.

    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

Facoltativamente, è possibile specificare la counter variabile nell' Next istruzione.You can optionally specify the counter variable in the Next statement. Questa sintassi migliora la leggibilità del programma, soprattutto se sono presenti cicli nidificati For .This syntax improves the readability of your program, especially if you have nested For loops. È necessario specificare la variabile visualizzata nell' For istruzione corrispondente.You must specify the variable that appears in the corresponding For statement.

Le start end espressioni, e step possono restituire qualsiasi tipo di dati che viene ampliato al tipo di counter .The start, end, and step expressions can evaluate to any data type that widens to the type of counter. Se si utilizza un tipo definito dall'utente per counter , potrebbe essere necessario definire l' CType operatore di conversione per convertire i tipi di start , end o nel step tipo di counter .If you use a user-defined type for counter, you might have to define the CType conversion operator to convert the types of start, end, or step to the type of counter.

EsempioExample

Nell'esempio seguente vengono rimossi tutti gli elementi da un elenco generico.The following example removes all elements from a generic list. Anziché per ogni... Nell'istruzione successiva, nell'esempio viene illustrata un' For istruzione... che esegue l' Next iterazione in ordine decrescente.Instead of a For Each...Next Statement, the example shows a For...Next statement that iterates in descending order. L'esempio usa questa tecnica perché il removeAt metodo fa sì che gli elementi dopo l'elemento rimosso abbiano un valore di indice inferiore.The example uses this technique because the removeAt method causes elements after the removed element to have a lower index value.

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

EsempioExample

Nell'esempio seguente viene iterata un'enumerazione dichiarata tramite un' istruzione enum.The following example iterates through an enumeration that's declared by using an Enum Statement.

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

EsempioExample

Nell'esempio seguente, i parametri dell'istruzione usano una classe con overload di operatori per gli + - operatori,, >= e <= .In the following example, the statement parameters use a class that has operator overloads for the +, -, >=, and <= operators.

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

Vedi ancheSee also