En Visual Basic existen los ciclos For y For Each, cada uno aplicable a tareas específicas.
VB6 y el clásico Visual Basic solo admitían ciclos por rango (For ... Next). En versiones posteriores (desde VB6 y VB.NET) apareció For Each, que permite recorrer elegantemente elementos de colecciones y arreglos.
El principal problema es la elección incorrecta del tipo de ciclo y el intento de modificar la colección dentro de For Each, lo que provoca errores en tiempo de ejecución.
Utiliza For regular cuando:
Aplica For Each cuando:
Ejemplo de código:
' Recorrido de elementos con modificación Dim arr() As Integer = {1, 2, 3} For i As Integer = 0 To arr.Length - 1 arr(i) = arr(i) * 2 Next ' Solo lectura de la colección Dim list As New List(Of String) From {"uno", "dos", "tres"} For Each s As String In list Console.WriteLine(s) Next
Características clave:
¿Se puede modificar la colección List(Of T) dentro de For Each?
No se puede. Esto llevará a una InvalidOperationException, ya que la estructura de la colección no debe cambiar durante la iteración.
¿Cómo salir correctamente de For Each antes de tiempo?
Usa la instrucción Exit For cuando se encuentre el elemento deseado.
For Each s In list If s = "dos" Then Exit For End If Next
¿Cuál es la diferencia en velocidad entre For y For Each para arreglos?
Normalmente, la diferencia es mínima, pero For puede ser un poco más rápido (especialmente para arreglos de tipos primitivos), ya que trabaja directamente con índices, mientras que For Each crea un objeto enumerador adicional.
** Caso negativo
Un desarrollador intenta eliminar elementos de List(Of T) dentro de For Each. Recibe un error InvalidOperationException durante la ejecución.
Pros:
Contras:
** Caso positivo
Para eliminar elementos se realiza un recorrido desde el final utilizando For regular:
For i = list.Count - 1 To 0 Step -1 If list(i) = "dos" Then list.RemoveAt(i) End If Next
Pros:
Contras: