Quale class di raccolta utilizzare: Hashtable o Dizionario?

Devo definire una class con un object collection interno per contenere diversi tipi di valori (come string, int, float, DateTime e bool) con una chiave stringa. Potrei usare Hashtable poiché non è una class di raccolta fortemente tipizzata, mentre il dizionario è utilizzato per elementi fortemente tipizzati (potrei usare l’object per Dizionario anche se).

Ecco il caso in cui vorrei definire la mia class e il suo utilizzo:

public class MyBaseClass { protected Hashtable ht = new Hashtable(); MyClass public SetValue(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 : MyBaseClass { public Data1 GetObject() { return new Data1 { Property1 = ht["key1"] as string, Property2 = Int.Parse(ht["key2"].ToString()) } } 

Con l’esempio sopra, non sono sicuro di quale sia la migliore raccolta per contenere i miei dati in MyBaseClass? Ho letto alcuni articoli su Hashtable. È una raccolta obsoleta e le prestazioni rispetto alla raccolta di dizionari sono molto più lente. Devo usare il dizionario o qualsiasi altra raccolta disponibile in .Net 3.5?

Personalmente userò Dictionary in questo caso. Per lo meno questo ti impedirà di provare a usare una chiave non stringa.

Personalmente smetterei di usare anche un campo protetto – considera l’aggiunta di un indicizzatore alla tua class base con un setter protetto e un getter pubblico:

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

Se si desidera che restituisca null all’accesso dalla chiave mancante, è necessario utilizzare TryGetValue nel getter. Allo stesso modo è ansible utilizzare Add nel setter se si desidera fallire con l’aggiunta di una chiave duplicata.

Devi sempre utilizzare le raccolte generiche, a meno che non ci sia un buon motivo per non farlo. Ciò garantisce che tutto sia ragionevolmente sicuro e riduce gli errori di programmazione. Vi sono anche vantaggi in termini di prestazioni se si memorizzano tipi di valore nel dizionario generico; se usi Hashtable, ogni tipo di valore dovrebbe essere inserito in una scatola.

Il tuo esempio, tuttavia, sembra intrinsecamente di tipo non sicuro e ha un odore di codice a riguardo. C’è una ragione particolare per cui hai due variabili di tipo per accedere allo stesso hashtable?

Hashtable esisteva in 1.1. Il dizionario non esisteva fino a quando i farmaci generici entrarono in 2.0. Non penso ci sia alcun motivo per usare Hashtable in 2.0 e oltre – è essenzialmente un dizionario hardcoded , ed è (probabilmente?) Solo lì per far funzionare il codice 1.1 ported.

Quindi, il dizionario dovrebbe essere il tuo object di scelta qui.

Vorrei usare un dizionario, ma volevo davvero rendere la mia raccolta “dattiloscritta”, potrei implementare il contenitore eterogeneo sicuro per tipo descritto nell’articolo 29 di Java efficace (l’esempio è per Java, ma l’applicazione dovrebbe funzionare per entrambe le lingue anche se i dettagli e le restrizioni possono essere diverse). Questa tecnica codifica il tipo di valore nella chiave.

Vorrei andare con il dizionario. Posso pensare a uno solo scenario in cui un Hashtable potrebbe essere preferito. È thread-safe per uno scrittore e più lettori senza utilizzare meccanismi di sincronizzazione. Ma, uno scenario del genere sarebbe molto specifico e piuttosto raro. E anche allora probabilmente andrei con il dizionario e userei tutte le normali primitive di sincronizzazione.