Historique de la question
La boucle For...Next existe dans Visual Basic depuis les premières versions, permettant de parcourir une plage de valeurs, souvent utilisée pour travailler avec des tableaux et des collections. Dans VB.NET, un compteur sémantiquement plus strict a été ajouté ainsi que la prise en charge du pas (Step).
Problème
L'erreur classique consiste à modifier la valeur du compteur de boucle (par exemple, i), ce qui entraîne un comportement erroné : le compteur est tout de même automatiquement incrémenté/décrémenté à la fin de chaque itération. Il est également important de définir correctement les limites du parcours des collections (par exemple, For i = 0 To arr.Length - 1).
Solution
Utilisez toujours des compteurs immuables ou placez immédiatement l'expression pour la limite supérieure dans une variable, si la collection peut changer à l'intérieur de la boucle. Ne modifiez pas explicitement la variable compteur dans le corps de la boucle.
Exemple de code :
Dim arr() As Integer = {1, 2, 3, 4} For i As Integer = 0 To arr.Length - 1 Console.WriteLine(arr(i)) Next
Caractéristiques clés :
Que se passe-t-il si vous modifiez manuellement le compteur dans le corps de la boucle ?
La valeur sera réellement modifiée uniquement dans l'itération actuelle, mais à la fin de l'itération, Visual Basic effectuera automatiquement l'incrément/décrément, ce qui entraînera un nombre de passages imprévisible.
For i = 1 To 5 If i = 3 Then i = 1 Console.WriteLine(i) Next
Peut-on utiliser For...Next pour parcourir des collections de type List(Of T) ?
Oui, mais il est préférable d'utiliser For Each pour les collections afin d'éviter les erreurs avec des tailles changeantes. For...Next ne conserve que les indices.
Que se passe-t-il si la limite supérieure est inférieure à la limite inférieure avec un pas positif ?
La boucle ne s'exécutera pas une seule fois.
For i = 5 To 1 ' sans Step - la boucle ne s'exécutera pas ... Next
Le compteur a été modifié manuellement lors de la découverte d'un certain élément, une tentative de sauter des éléments futurs a conduit à sauter certaines itérations et à une boucle infinie.
Avantages :
Inconvénients :
Utilisation d'une variable distincte pour contrôler les conditions, absence d'interférence avec le compteur de la boucle.
Avantages :
Inconvénients :