要使用哪个集合类:Hashtable还是Dictionary?

我需要定义一个具有内部集合对象的类,以通过字符串键来保存不同类型的值(例如string,int,float,DateTime和bool)。 我可以使用Hashtable,因为它不是强类型集合类,而字典用于强类型项(即使我可以使用对象的字典)。

这是我想要定义我的类及其用法的情况:

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()) } } 

以上示例,我不确定在MyBaseClass中保存数据的最佳集合是什么? 我读了一些关于Hashtable的文章。 它是一个过时的集合,与Dictionary集合相比性能要慢得多。 我应该使用.Net 3.5中的Dictionary或任何其他可用的集合吗?

我个人在这种情况下使用Dictionary 。 至少这将阻止您尝试使用非字符串键。

我个人也会停止使用受保护的字段 – 考​​虑使用受保护的setter和public getter向您的基类添加索引器:

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

如果您希望它在缺少键的访问时返回null ,则应在getter中使用TryGetValue 。 同样,如果要在重复键添加时失败,可以在setter中使用Add

你应该总是使用generics集合,除非有充分的理由不这样做。 这可确保一切都是合理的类型安全并减少编程错误。 如果将值类型存储在通用字典中,还有性能优势; 如果使用Hashtable,则必须将每个值类型装箱。

然而,你的例子似乎本质上是类型不安全的,并且有一个代码味道。 您是否有一个特殊原因可以使用两个类型变量来访问相同的哈希表?

Hashtable存在于1.1中。 字典在2.0中出现generics之前不存在。 我认为没有任何理由在2.0及更高版本中使用Hashtable – 它本质上是一个硬编码的Dictionary ,并且它(可能是?)只是为了让移植的1.1代码工作。

所以,词典应该是你选择的对象。

我会使用Dictionary,但我真的想让我的集合类型安全,我可能会实现Effective Java第29项中描述的类型安全异构容器(该示例适用于Java,但应用程序应该适用于两种语言,尽管详细信息和限制可能不同)。 此技术将值的类型编码到密钥中。

我会选择字典。 我只能想到一个Hashtable 可能是首选的场景。 对于一个编写器和多个读取器而言,它是线程安全的而不使用同步机制。 但是,这种情况非常具体而且非常罕见。 即便如此,我可能会使用Dictionary并使用所有普通的同步原语。