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.
Sugerencia |
---|
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)
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. |