ProgrammazioneSviluppatore VB.NET

Come viene implementata la gestione dei cicli For e For Each in Visual Basic, in quali casi scegliere uno o l'altro ciclo, e quali errori si verificano frequentemente quando si lavora con le collezioni?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

In Visual Basic ci sono cicli For e For Each, ognuno applicabile per compiti specifici.

Storia della domanda

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.

Problema

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.

Soluzione

Usa il For normale quando:

  • hai bisogno dell'indice dell'elemento
  • è necessario modificare gli elementi dell'array tramite indice
  • è richiesta l'iterazione su un intervallo di numeri

Utilizza For Each quando:

  • conta solo il valore di ciascun elemento
  • la struttura della collezione è sconosciuta in anticipo
  • è richiesta eleganza e minimizzazione degli errori

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:

  • Il For è utilizzato per lavorare con gli indici
  • Non è possibile modificare la collezione stessa all'interno del ciclo For Each
  • For Each è universale per qualsiasi oggetto IEnumerable

Domande trabocchetto.

È 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.

Errori tipici e anti-pattern

  • Modificare la collezione durante il For Each
  • Confondere gli indici quando si utilizza il For normale con array e collezioni
  • Utilizzare il For Each quando è necessario l'indice dell'elemento

Esempio dalla vita reale

** 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:

  • Codice semplice per la lettura della collezione

Svantaggi:

  • Il programma termina in modo anomalo

** 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:

  • Nessun errore di iterazione, tutti gli elementi necessari vengono rimossi

Svantaggi:

  • Richiede più codice e comprensione della struttura dei dati