Instrucción For...Next (Visual Basic)

Repite un grupo de instrucciones un número de veces especificado.

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

Partes

Parte

Descripción

counter

Se requiere en la instrucción For. Variable numérica. Variable de control para el bucle.

datatype

Obligatorio, a menos que counter ya se haya declarado. Tipo de datos de counter.

start

Obligatorio. Expresión numérica. Valor inicial de counter.

end

Obligatorio. Expresión numérica. Valor final de counter.

step

Opcional. Expresión numérica. Cantidad en la que se incrementa counter cada vez que se recorre el bucle.

statements

Opcional. Una o más instrucciones entre For y Next que se ejecutan un número especificado de veces.

Continue For

Opcional. Transfiere el control a la siguiente iteración del bucle.

Exit For

Opcional. Transfiere el control fuera del bucle For.

Next

Obligatorio. Termina la definición del bucle For.

Nota

La palabra clave To se utiliza aquí con el fin de especificar el intervalo para el contador. También se utiliza para especificar un intervalo de valores en Instrucción Select...Case (Visual Basic) y en declaraciones de matriz. Para obtener más información sobre las declaraciones de matriz, vea Instrucción Dim (Visual Basic).

Comentarios

Utilice una estructura For...Next cuando desee repetir un conjunto de instrucciones un número fijo de veces.

Cuando comienza un bucle For...Next, Visual Basic evalúa start end y step. Esta es la única vez que evalúa estos valores. Después asigna start a counter. Antes de ejecutar el bloque de instrucciones, compara counter con end. Si counter ya es mayor que el valor de end (o menor, si stepes negativo), el bucle For termina y el control se pasa a la instrucción que sigue a la instrucción Next. De lo contrario se ejecuta el bloque de instrucciones.

Cada vez que Visual Basic encuentra la instrucción Next, incrementa counter en el valor indicado en step y vuelve a la instrucción For. Compara de nuevo counter con end y, otra vez, ejecuta el bloque o sale del bucle, según el resultado. Este proceso continúa hasta que counter sobrepasa end o se encuentra una instrucción Exit For.

El bucle no se detiene hasta que counter ha sobrepasado end. Si counter es igual a end, el bucle continúa. La comparación que determina si se ejecuta el bloque es counter <= end si step es positivo y counter >= end si step es negativo.

Cambiar el valor de counter mientras se está dentro de un bucle puede dificultar la lectura y la depuración del código. Cambiar el valor de start, end o step no afecta a los valores de iteración especificados cuando se entró en el bucle por primera vez.

SugerenciaSugerencia

Una Instrucción While...End While (Visual Basic) o una Instrucción Do...Loop (Visual Basic) funciona bien cuando no se sabe de antemano cuántas veces se deben ejecutar las instrucciones del bucle. Sin embargo, cuando espere ejecutar el bucle un número concreto de veces, For...Next es una mejor elección. Determina el número de iteraciones cuando se entra en el bucle por primera vez.

Step (argumento)

El valor de step puede ser positivo o negativo. Determina el procesamiento del bucle como sigue:

Valor de step

El bucle se ejecuta si

Positivo o cero

counter <= end

Negativo

counter >= end

Si no se especifica, el valor predeterminado de step es 1.

Argumento de contador

Si counter no se ha declarado fuera de este bucle, se debe declarar en la instrucción For. En tal caso, el ámbito de counter es el cuerpo del bucle. Sin embargo, no se puede declarar counter fuera y dentro del bucle.

Opcionalmente, puede especificarse counter en la instrucción Next. Esto mejora la legibilidad del programa, sobre todo si se han anidado bucles For. La variable que se especifique debe ser igual a la que aparece en la instrucción For correspondiente.

El tipo de datos de counter determina el tipo de la iteración, y debe ser uno de los siguientes:

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

  • Una enumeración que se declara utilizando una Instrucción Enum (Visual Basic).

  • Un objeto Object.

  • Un tipo T que tiene los siguientes operadores, donde B es un tipo que puede utilizarse en una expresión 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

Las expresiones start, end y step pueden evaluarse como cualquier tipo de datos que se amplíe al tipo de counter. Si se utiliza un tipo definido por el usuario para counter, significa que hay que definir el operador de conversión CType para convertir los tipos de start, end o step al tipo de counter.

Bucles anidados

Se pueden anidar bucles For colocando un bucle dentro de otro. Sin embargo, cada bucle debe tener una variable counter única.

También puede anidar distintos tipos de estructuras de control unos dentro de otros. Para obtener más información, vea Estructuras de control anidadas (Visual Basic).

Si una instrucción Next de un nivel de anidamiento externo se encuentra antes de la instrucción Next de un nivel interno, el compilador genera un error. Sin embargo, el compilador sólo puede detectar este error superpuesto si se especifica counter en cada instrucción Next.

Salida de

Exit (Instrucción, Visual Basic) sale inmediatamente del bucle For...Next y transfiere el control a la instrucción que sigue a la instrucción Next.

Puede incluir cualquier número de instrucciones Exit For en un bucle For...Next. Cuando se utiliza dentro de bucles For…Next anidados, Exit For sale del bucle más profundo y transfiere el control al siguiente nivel de anidamiento.

Exit For se utiliza a menudo después de evaluar alguna condición, por ejemplo en una estructura If...Then...Else. Puede que desee utilizar Exit For para las siguientes condiciones:

  • Continuar la iteración es innecesario o imposible. Esto podría deberse a un valor erróneo o una solicitud de terminación.

  • Se detecta una excepción en Try...Catch...Finally. Puede utilizar Exit For al final del bloque Finally .

  • Hay un bucle infinito, que es un bucle que se podría ejecutar muchas o incluso infinitas veces. Si se detecta este tipo de condición, se puede utilizar Exit For para escapar del bucle. Para obtener más información, vea Instrucción Do...Loop (Visual Basic).

la instrucción Continue For transfiere el control inmediatamente a la siguiente iteración del bucle. Para obtener más información, vea Continue (Instrucción, Visual Basic).

Ejemplo

En el siguiente ejemplo se muestra el uso de la instrucción For…Next. Una variable de contador de bucle se incrementa con cada iteración del bucle. No se especifica el argumento step, así que adopta el valor predeterminado de 1.

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

En el ejemplo siguiente, los argumentos counter y step son números de punto flotante Double.

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 

En el ejemplo siguiente se muestran estructuras For...Next anidadas con valores de incremento diferentes. El bucle externo crea una cadena para cada iteración del bucle. El bucle interior disminuye una variable de contador de bucle por cada iteración del bucle.

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

El ejemplo siguiente elimina todos los elementos de una lista genérica. En lugar de una instrucción Instrucción For Each...Next (Visual Basic), se utiliza una instrucción For...Next que se repite en orden descendente. Esto es porque el método removeAt hace que los elementos que hay después del elemento eliminado tengan un valor de índice más bajo.

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

En el siguiente ejemplo se muestra el uso de las instrucciones Continue For y 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

En el ejemplo siguiente se recorre en iteración una enumeración que se declara utilizando Instrucción Enum (Visual Basic).

Public Enum Mammals
    Buffalo
    Gazelle
    Mongoose
    Rhinocerous
    Whale
End Enum


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

En el siguiente ejemplo, los parámetros de la instrucción utilizan una clase que tiene sobrecargas de operador para los operadores +, -, >= y <=.

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

Vea también

Tareas

Cómo: Mejorar el rendimiento de un bucle (Visual Basic)

Referencia

Instrucción While...End While (Visual Basic)

Instrucción Do...Loop (Visual Basic)

Exit (Instrucción, Visual Basic)

Instrucción For Each...Next (Visual Basic)

List<T>

Conceptos

Estructuras de bucles (Visual Basic)

Estructuras de control anidadas (Visual Basic)

Historial de cambios

Fecha

Historial

Motivo

Diciembre de 2010

Reorganizada la sección Comentarios y agregados ejemplos.

Mejora de la información.