2009-09-16 9 views
1

J'ai besoin de définir une classe avec un objet de collection interne pour contenir différents types de valeurs (telles que string, int, float, DateTime et bool) par une clé de chaîne. Je pourrais utiliser Hashtable car ce n'est pas une classe de collection fortement typée, alors que le Dictionary est utilisé pour les items fortement typés (je pourrais utiliser object pour Dictionary même si).Quelle classe de collection utiliser: Hashtable ou Dictionary?

est ici le cas, je voudrais définir ma classe et son utilisation:

public class MyBaseClass<D> { 
    protected Hashtable ht = new Hashtable(); 

    MyClass public SetValue<T>(string key, T value) 
    { 
     ht.Add(key, value); 
     return this; 
    } 

    public abstract D GetObject(); 
} 

// Example of using the base class for data as class Data1 
public MyClass<Data1> : MyBaseClass<Data1> { 
     public Data1 GetObject() { 
     return new Data1 { 
      Property1 = ht["key1"] as string, 
      Property2 = Int.Parse(ht["key2"].ToString()) 
      } 
} 

l'exemple ci-dessus, je ne suis pas sûr quelle est la meilleure collection de tenir mes données MyBaseClass? J'ai lu quelques articles sur Hashtable. C'est une collection obsolète et la performance comparée à la collection Dictionary est beaucoup plus lente. Dois-je utiliser Dictionary ou toute autre collection disponible dans .Net 3.5?

+1

Le dictionnaire est un HashTable optimisé. Je pense que cela répond à votre question :) –

Répondre

4

Vous devriez toujours utiliser des collections génériques, à moins qu'il y ait une très bonne raison de ne pas le faire. Cela garantit que tout est de type raisonnablement sûr et réduit les erreurs de programmation. Il y a également des avantages de performance si vous stockez des types de valeur dans le dictionnaire générique; Si vous utilisez Hashtable, chaque type de valeur doit être encadré.

Votre exemple, cependant, semble intrinsèquement dangereux pour le type et a une odeur de code à ce sujet. Y a-t-il une raison particulière pour laquelle vous avez deux variables de type pour accéder à la même hashtable?

9

Personnellement, j'utiliserais Dictionary<string, object> dans ce cas. À tout le moins cela vous empêchera d'essayer d'utiliser une clé non-chaîne.

Personnellement, je cesser d'utiliser un champ de protection aussi bien - envisager d'ajouter un indexeur à votre classe de base avec un setter protégé et un getter public:

public object this[string key] 
{ 
    get { return ht[key]; } 
    protected set { ht[key] = value; } 
} 

Si vous voulez revenir null sur l'accès en manquant clé, vous devez utiliser TryGetValue dans le getter. De même, vous pouvez utiliser Add dans le setter si vous voulez échouer sur l'addition de la clé en double.

+0

effectivement dans ce cas, je me fous de null ou d'exception. Je voudrais obtenir une exception au cas où j'essayerais d'obtenir une valeur qui n'est pas encore définie. –

+0

Dans ce cas, le code que j'ai posté serait bien. Si vous utilisez deux fois la même touche pour le * réglage *, il écrasera simplement la valeur précédente. –

+0

@Jon Skeet, merci pour votre info. Je peux utiliser cette fonctionnalité de remplacement pour lire un autre ensemble de propriétés, puis créer un nouvel obj basé sur les nouvelles données d'ensemble. Dans l'ordre, je peux réutiliser l'instance dans un appel de boucle ou de méthode (l'appel de boucle ou de méthode est une sorte de répétition avec des valeurs différentes). –

0

Je voudrais aller avec le dictionnaire. Je peux penser à un seul scénario où un Hashtable pourrait être préféré. Il est thread-safe pour un auteur et plusieurs lecteurs sans utiliser les mécanismes de synchronisation. Mais, un tel scénario serait très spécifique et assez rare. Et même alors j'irais probablement avec le dictionnaire et j'utiliserais toutes les primitives de synchronisation normales.

1

Je voudrais utiliser un dictionnaire, mais je voulais vraiment faire ma collection typesafe, je pourrais implémenter le conteneur hétérogène de type sécurité décrit dans Item 29 of Effective Java (l'exemple est pour Java, mais l'application devrait fonctionner pour les deux langues bien que les détails et les restrictions peuvent différer). Cette technique code le type de la valeur dans la clé.

+0

Plus 1 pour intéressant! Le lien original dans votre commentaire est cassé, mais voici un article sur la technique: http://idlebrains.org/tutorials/java-tutorials/effective-java-typesafe-heterogeneous-container-pattern/ Aussi, voici le livre sur Amazon: http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683/ref=sr_1_1?ie=UTF8&qid=1410969528&sr=8-1&keywords=effective+java – Bill

2

Hashtable existe en 1.1. Le dictionnaire n'existait pas avant l'arrivée des génériques en 2.0. Je ne pense pas qu'il y ait une raison d'utiliser Hashtable dans 2.0 et au-delà - c'est essentiellement une chaîne Dictionary <, l'objet >, et c'est (probablement?) Juste pour laisser fonctionner le code 1.1. Donc, Dictionnaire devrait être votre objet de choix ici.

Questions connexes