ProgrammationDéveloppeur Backend (Visual Basic)

Comment implémenter des dictionnaires (Dictionary(Of TKey, TValue)) en Visual Basic, quelles opérations sont disponibles, quelles pièges peuvent survenir lors de l'accès à des valeurs par une clé inexistante ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Historique de la question

Avec l'arrivée de .NET Framework, Visual Basic a obtenu une structure de stockage de paires clé-valeur typée et à haute performance — Dictionary(Of TKey, TValue). C'est le conteneur associatif standard pour des recherches rapides.

Problème

Travailler avec un dictionnaire entraîne souvent des erreurs : une tentative d'accès à une valeur via une clé qui n'existe pas entraîne une exception. Les opérations d'ajout, de modification et d'ajout de nouvelles valeurs sont également souvent confondues.

Solution

Pour accéder aux valeurs, utilisez un indexeur ou les méthodes TryGetValue, ContainsKey. Pour éviter l'exception KeyNotFoundException, effectuez toujours une vérification explicite :

Exemple de code :

Dim dict As New Dictionary(Of String, Integer)() dict.Add("un", 1) dict("deux") = 2 ' Ajout d'une nouvelle paire If dict.ContainsKey("trois") Then Console.WriteLine(dict("trois")) ' Ne déclenchera pas d'erreur Else Console.WriteLine("Clé non trouvée") End If Dim value As Integer = 0 If dict.TryGetValue("un", value) Then Console.WriteLine(value) End If

Caractéristiques clés :

  • Accès rapide par clé (hachage)
  • La vérification explicite de l'existence de la clé prévient l'erreur
  • La suppression et le remplacement de valeurs par clé sont réalisés via Remove et l'indexeur

Questions pièges.

Est-il vrai que dict("clé") ajoute toujours une nouvelle paire clé-valeur ?

Non. Si la clé existe, la valeur est mise à jour. Si elle n'existe pas — la paire est ajoutée. Pour ajouter avec une erreur en cas de clé existante — utilisez Add.

Est-ce que TryGetValue lancera une exception si la clé n'existe pas ?

Non. Il renverra False, sans déclencher d'exception, et ne modifiera pas value. C'est un moyen sûr d'accès.

Peut-on stocker des types valeur (comme Integer) dans un Dictionary comme TValue et obtenir null pour une clé manquante ?

Non. Pour un type valeur, la valeur par défaut pour le type est renvoyée (0 pour Integer), mais l'accès via l'indexeur déclenchera toujours une exception en l'absence de la clé.

Erreurs typiques et anti-patterns

  • Accès à une clé inexistante via l'indexeur sans vérification
  • Doublons de clés via Add (Provoque ArgumentException)
  • Ignorer le retour de TryGetValue

Exemple de la vie réelle

Cas négatif

Accès au dictionnaire par index sans vérification préalable se répète à plusieurs endroits — plantages de programme fréquents.

Avantages :

  • Code plus compact

Inconvénients :

  • Instabilité de l'application, difficile à débugger

Cas positif

Utilisation généralisée de TryGetValue, tous les accès sont protégés, les cas d'absence de clé sont gérés logiquement.

Avantages :

  • Comportement stable, pas d'exceptions

Inconvénients :

  • Nécessité de créer des variables out pour les valeurs