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

时间:2009-09-16 15:28:17

标签: c# collections dictionary

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

以下是我想要定义我的课程及其用法的案例:

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

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

5 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

Hashtable存在于1.1中。字典在2.0中出现泛型之前不存在。我认为没有任何理由在2.0及更高版本中使用Hashtable - 它本质上是一个硬编码的字典&lt; string,object&gt; ,它(可能是?)只是让移植的1.1代码工作。

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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