IDictionary vs Hashtable -

时间:2012-06-09 18:07:36

标签: c# .net entity-framework

很多消息来源谈论这个问题,但我不太了解这个概念。 IDictionary是通用的,它的类型安全等。

当我深入了解EntityFrameworkv5时,我在LogEntry类中看到了一个声明如下的属性。

private IDictionary<string, object> extendedProperties;

问题是为什么他们更喜欢使用IDictionary来对抗Hashtable,因此Hashtable也将键作为字符串和对象。唯一的原因是通过选择IDictionary来使属性具有多态性?

提前致谢。

4 个答案:

答案 0 :(得分:3)

如今,使用Hashtable的理由很少。 Dictionary<>在大多数方面都比它好。如果不是这样,你通常可以找到另一个强类型的集合,它比任何一个都更好。

  • 类型安全。
  • 没有拳击和拆箱的严重开销。
  • 实现IDictionary<>,它与.NET和第三方代码非常兼容。
  • 在许多方面表现优于Hashtable。请参阅链接:Link #1Link #2

如果您问为什么键入属性为IDictionary<>而不是Dictionary<>,则有几个原因。

  • 通常认为最佳做法是尽可能经常使用接口,而不是常规类型,尤其是在框架中。
  • 可以相当容易地更改接口的实现,但是很难改变具体类的性质而不会导致依赖代码的兼容性问题。
  • 使用界面,您可以利用Covariance and Contravariance
  • 外部代码更有可能使用比具体类IDictionary<>更通用的接口Dictionary<>。因此,使用IDictionary<>可以让其他开发人员更好地与该属性进行交互。
  • 可能还有更多。这些只是我的头脑。

答案 1 :(得分:1)

好吧是的,如果他们已经将extendedproperies定义为返回哈希表,那么他们将一直坚持使用它,除非他们想要破坏使用扩展属性的所有代码。

返回接口的重点是,只要它继续这样做,方法的实现方式并不重要。

“唯一的理由是让属性变为多态”错过了重点,应该没有什么理由不这样做。如果你可以返回一个接口,那么返回一个接口,大部分时间都是好的设计。

答案 2 :(得分:1)

因此,这里的大部分答案都是关于将Dictionary与Hashtable进行比较以达到一般目的,而不是为什么他们选择了特定的实现。

在该特定实现中,您是正确的,它使用对象作为返回类型,因此字典的强类型优势不可用。

IMO归结为New vs Old,ArrayList,Hashtable等是旧技术,并且在很大程度上不受欢迎,因为它们没有很多功能(在其他答案中有描述)。虽然在这种特殊情况下不使用这些功能,但是切换回旧技术并没有很大的好处,它为个人发展提供了一个更好的例子。

所以更重要的是“这就是我们现在这样做的方式”

答案 3 :(得分:0)

HashTable是弱类型的,只能返回Object。字典&lt;&gt;对于存储在其中的任何类型都是强类型的。