ProgrammationDéveloppeur VB.NET, Développeur Backend

Comment fonctionnent les boucles For Each dans Visual Basic ? Quelles sont les différences avec For et While, quels objets peuvent être parcourus de cette manière et quels pièges se présentent lors de la modification de la collection dans la boucle ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

La boucle For Each dans Visual Basic est destinée à parcourir séquentiellement tous les éléments d'une collection ou d'un tableau. Son utilisation simplifie le travail avec des objets énumérables (Collection, Array, listes, etc.), sans nécessiter un accès explicite aux indices.

Syntaxe :

For Each element As DataType In collection ' Actions avec element Next

Différences avec d'autres boucles :

  • For — nécessite de spécifier un compteur et une plage, efficace lorsqu'un accès aux éléments par indice est nécessaire.
  • While — s'exécute tant que la condition est vraie, adapté pour des quantités d'itérations imprévisibles.
  • For Each — itère sur tous les éléments sans accès aux indices, convenant aux collections modernes.

Limitations et caractéristiques de For Each :

  • Il n'est pas possible de modifier directement les éléments de la collection (surtout si la collection est immuable ou structurée).
  • La collection doit implémenter l'interface IEnumerable.
  • Lors de la modification de la collection (ajout/suppression d'éléments) durant la boucle, une exception InvalidOperationException peut survenir.

Exemple :

Dim items As New List(Of Integer)({1, 2, 3}) For Each item As Integer In items Console.WriteLine(item) Next

Essayer de modifier la collection à l'intérieur de la boucle peut provoquer une erreur :

For Each item As Integer In items If item = 2 Then items.Remove(item) ' Exception ! End If Next

Question piège

Peut-on modifier les éléments de la collection par valeur en utilisant For Each, si les éléments sont des structures ?

Non, si les éléments de la collection sont des structures (types valeur), alors la variable d'itération dans For Each contient une copie de la valeur. Toute modification de la variable n'affectera pas l'élément réel de la collection. Par exemple :

Structure Point Public X As Integer End Structure Dim points As New List(Of Point)({New Point With {.X = 1}}) For Each pt In points pt.X = 100 ' Ne modifie pas points(0).X Next

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


Histoire

Dans le projet, on utilisait For Each pour modifier les champs des structures des employés. L'itération ne modifiait pas les données d'origine, car l'objet d'itération était une copie et non l'élément lui-même de la collection. En raison de cela, la mise à jour des salaires ne s'effectuait pas.


Histoire

Lors de la traversée d'une liste dans For Each, des éléments étaient supprimés à l'intérieur de la condition - en conséquence, l'application lançait InvalidOperationException et se terminait de manière abrupte.


Histoire

Le parcours de la collection via For Each sans tenir compte de sa mutabilité a conduit à une boucle infinie, lorsque une source de données externe remplissait cette collection en même temps qu'elle était lue, provoquant des erreurs logiques dans les calculs.