我需要定义一个带有内部集合对象的类,以通过字符串键来保存不同类型的值(例如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中的字典或任何其他集合吗?
答案 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并使用所有正常的同步原语。