ProgrammationDéveloppeur Backend (VB.NET)

Comment créer et utiliser un dictionnaire avec des clés arbitraires (Dictionary) dans Visual Basic, quelle est la différence entre Dictionary et Hashtable, et quelles sont les spécificités du travail avec des clés manquantes ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Historique de la question :

Dans VB.NET, la classe Dictionary(Of TKey, TValue) est devenue le standard pour le stockage associatif de données (clé-valeur). Dans le VB6 classique, l'objet Scripting.Dictionary ou la collection Collection étaient souvent utilisés, ainsi que le type Hashtable, apparu dans les premières versions de .NET. Ces structures permettent de trouver rapidement des valeurs par clé et ont remplacé des approches moins sûres en termes de type.

Problème

La différence non évidente entre Dictionary et Hashtable et les erreurs potentielles lors de la recherche d'une clé manquante. Par exemple, essayer d'accéder à une clé qui n'existe pas générera une erreur dans certains cas et pas dans d'autres. De plus, les différences en termes de sécurité de type et de performance peuvent entraîner un choix de collection incorrect.

Solution

Dans les versions modernes de VB.NET, il est considéré comme une bonne pratique d'utiliser Dictionary(Of TKey, TValue), où TKey et TValue sont strictement typés :

Dim dict As New Dictionary(Of String, Integer)() dict.Add("apple", 1) dict.Add("banana", 2) If dict.ContainsKey("banana") Then Console.WriteLine(dict("banana")) ' Affichera 2 End If ' Obtention sécurisée de la valeur Dim value As Integer If dict.TryGetValue("cherry", value) Then Console.WriteLine(value) Else Console.WriteLine("Clé inexistante !") End If

Caractéristiques clés :

  • Dictionary(Of TKey, TValue) fonctionne plus rapidement, est standardement sûr en termes de type, et permet des clés arbitraires (si GetHashCode/Equals est correctement implémenté).
  • Hashtable accepte et retourne Object, ne prend pas en charge les génériques, est plus lent et moins commode dans le code moderne.
  • L'accès à une clé manquante via le dictionnaire génère une exception KeyNotFoundException. Utilisez ContainsKey ou TryGetValue pour un accès sécurisé.

Questions pièges.

Peut-on utiliser Object comme clé sans restrictions dans Dictionary ?

Formellement oui, mais une implémentation correcte des méthodes GetHashCode et Equals est requise pour la classe servant de clé. Sinon, des collisions et des erreurs de recherche peuvent survenir.

Que se passera-t-il si l'on accède à une clé inexistante via dict("foo") ?

Une exception KeyNotFoundException sera levée. Sans vérification préalable de la clé (via ContainsKey ou TryGetValue), le programme échouera.

Dictionary et Hashtable soutiennent-ils le même ordre d'éléments ?

Non. Les deux classes ne garantissent pas l'ordre d'ajout des éléments. Pour maintenir l'ordre, utilisez SortedDictionary, OrderedDictionary ou d'autres structures.

Erreurs typiques et anti-modèles

  • Accéder aux valeurs du dictionnaire sans vérifier la présence de la clé.
  • Utiliser Hashtable dans le code moderne sans nécessité aiguë — absence de sécurité de type.
  • Utiliser des objets avec des codes de hachage instables comme clés (par exemple, des objets mutables).

Exemple de la vie réelle

Cas négatif

Un développeur a choisi Hashtable pour stocker de grands volumes de données utilisateur. Des erreurs difficiles à détecter sont survenues : la même clé ne correspondait pas toujours, des erreurs Object.ReferenceEquals apparaissaient, un type clé instable était lié.

Avantages :

  • Prototypage rapide, solution à minima fonctionnelle.

Inconvénients :

  • Difficile à déboguer.
  • Collection de types "Object" - difficile de détecter les erreurs de type.
  • TryGetValue ne fonctionne pas.

Cas positif

Ils sont passés à Dictionary(Of Guid, User) : typage strict, support de TryGetValue, élimination des erreurs de collision. La performance a augmenté.

Avantages :

  • Comportement prédictif.
  • Pas d'erreurs de type, moins de temps consacré au débogage.

Inconvénients :

  • Nécessité d'implémenter correctement GetHashCode/Equals si un type clé personnalisé est utilisé.