En Visual Basic, les collections (tableaux, listes, dictionnaires, etc.) prennent en charge l'accès à la fois par index et à l'aide d'itérateurs (par exemple, via For Each). Dans l'histoire du langage, le premier élément d'un tableau standard avait un index de 0, mais en raison de la compatibilité avec VB6, il existe des tableaux déclarés avec 1. Cela influence l'ordre d'accès et peut entraîner des erreurs. De plus, les collections de type Dictionary prennent en charge la recherche par clé, mais une tentative d'accès à un élément inexistant peut provoquer une exception.
Le problème d'accès réside dans les différences de syntaxe, les particularités du fonctionnement des indexeurs, et le fait que toutes les collections ne retournent pas Null ou Nothing en cas d'absence d'élément — il y a souvent une exception. Lors de l'utilisation de boucles, il est important de respecter la plage des index et de vérifier au préalable la taille de la collection.
Une solution pour un accès sûr comprend la vérification de la longueur, le travail avec les méthodes ContainsKey ou TryGetValue pour les dictionnaires, ainsi que l'énumération des éléments à l'aide de For Each, qui accède aux valeurs existantes sans risque de dépassement.
Exemple de code :
Dim list As New List(Of String)({"a", "b", "c"}) For i As Integer = 0 To list.Count - 1 Console.WriteLine(list(i)) Next ' Itération via l'itérateur : For Each item In list Console.WriteLine(item) Next ' Accès sûr dans Dictionary Dim dict As New Dictionary(Of Integer, String) dict(1) = "un" If dict.ContainsKey(2) Then Console.WriteLine(dict(2)) End If
Caractéristiques clés :
Peut-on accéder à Dictionary par index, comme à un tableau ?
Non, le Dictionary ne prend pas en charge l'accès par index numérique, seulement par clé. Pour parcourir les clés dans l'ordre, il faut obtenir la collection des clés :
For Each key In dict.Keys Console.WriteLine(dict(key)) Next
Que se passe-t-il si l'on accède à une List par un index en dehors de la plage ?
Une exception ArgumentOutOfRangeException sera levée. Vérifiez toujours que l'index est inférieur à Count et supérieur ou égal à 0.
For Each peut-il ignorer des éléments si la collection est modifiée pendant l'itération ?
Oui, modifier la collection à l'intérieur d'un For Each entraîne une exception InvalidOperationException. Évitez d'ajouter ou de supprimer des éléments pendant l'itération :
' Exemple d'erreur For Each x In list list.Remove(x) ' Déclenchera une exception Next
Les débutants ajoutaient des éléments à une List à l'intérieur d'une boucle For Each, ce qui entraînait l'échec de l'application avec l'erreur InvalidOperationException.
Avantages :
Avant de commencer l'itération, sauvegarder la liste des éléments dans un tableau distinct, travailler avec une copie, ou utiliser For avec un index. Accéder au Dictionary uniquement après avoir vérifié l'existence de la clé.
Avantages :