ProgrammationDéveloppeur Visual Basic/.NET, Développeur Backend

Comment est réalisé l'accès aux éléments des collections et leur itération par index et à l'aide d'itérateurs en Visual Basic ? Quelles sont les pièges lors de l'accès à des éléments inexistants ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Les index de la plupart des collections commencent par 0, mais des tableaux avec une borne inférieure arbitraire sont possibles.
  • L'accès à un index inexistant déclenche une exception ; la syntaxe For Each aide à éviter de telles erreurs.
  • Pour les dictionnaires, il faut vérifier l'existence de la clé avant d'y accéder.

Questions pièges.

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

Erreurs typiques et anti-patterns

  • Ignorer la vérification des index lors de l'accès par tableau/liste
  • Modifier la collection durant l'itération
  • S'attendre à ce qu'un Dictionary renvoie Nothing pour une clé manquante (déclenchera une erreur)

Exemple concret

Cas négatif

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 :

  • Mise en œuvre rapide des exigences du client Inconvénients :
  • Fonctionnement instable, erreurs fréquentes lors de l'exécution

Cas positif

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 :

  • Prévisibilité, fonctionnement stable du code
  • Plus facile à déboguer en cas d'erreurs Inconvénients :
  • Un peu plus de code et de complexité lors de l'écriture