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 :
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.
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 :
Inconvénients :
Ils sont passés à Dictionary(Of Guid, User) : typage strict, support de TryGetValue, élimination des erreurs de collision. La performance a augmenté.
Avantages :
Inconvénients :