In Visual Basic ci sono cicli For e For Each, ognuno applicabile per compiti specifici.
VB6 e il classico Visual Basic supportavano solo cicli basati su intervallo (For ... Next). Nelle versioni successive (a partire da VB6 e VB.NET) è stato introdotto il For Each, che consente di scorrere elegantemente gli elementi delle collezioni e degli array.
Il problema principale è la scelta errata del tipo di ciclo e il tentativo di modificare la collezione all'interno di For Each, il che porta a errori di esecuzione.
Usa il For normale quando:
Utilizza For Each quando:
Esempio di codice:
' Scorrimento degli elementi con modifica Dim arr() As Integer = {1, 2, 3} For i As Integer = 0 To arr.Length - 1 arr(i) = arr(i) * 2 Next ' Solo lettura della collezione Dim list As New List(Of String) From {"one", "two", "three"} For Each s As String In list Console.WriteLine(s) Next
Caratteristiche chiave:
È possibile modificare la collezione List(Of T) all'interno di For Each?
No. Questo porterà a un'InvalidOperationException, poiché la struttura della collezione non deve cambiare durante l'iterazione.
Come uscire correttamente da For Each prima del tempo?
Usare l'operatore Exit For quando si trova l'elemento desiderato.
For Each s In list If s = "two" Then Exit For End If Next
Qual è la differenza di velocità tra For e For Each per gli array?
Di solito la differenza è minima, ma il For può essere leggermente più veloce (soprattutto per array di tipi primitivi), poiché lavora direttamente con gli indici, mentre il For Each crea un oggetto enumeratore aggiuntivo.
** Caso negativo
Un sviluppatore cerca di rimuovere elementi da List(Of T) all'interno di For Each. Ottiene un errore di InvalidOperationException durante l'esecuzione.
Vantaggi:
Svantaggi:
** Caso positivo
Per rimuovere elementi viene effettuato un ciclo a ritroso utilizzando il For normale:
For i = list.Count - 1 To 0 Step -1 If list(i) = "two" Then list.RemoveAt(i) End If Next
Vantaggi:
Svantaggi: