C# IDictionary与哈希表-

C# IDictionary与哈希表-,c#,.net,entity-framework,C#,.net,Entity Framework,很多人都在谈论这个问题,但我不太理解这个概念。IDictionary是泛型的,其类型安全性等 当我深入研究EntityFrameworkv5时,我看到一个属性在LogEntry类中声明如下 private IDictionary<string, object> extendedProperties; 私有IDictionary扩展属性; 问题是为什么他们更喜欢IDictionary而不是Hashtable,因此Hashtable也将键作为字符串和对象。唯一的原因是通过选择IDic

很多人都在谈论这个问题,但我不太理解这个概念。IDictionary是泛型的,其类型安全性等

当我深入研究EntityFrameworkv5时,我看到一个属性在LogEntry类中声明如下

private IDictionary<string, object> extendedProperties;
私有IDictionary扩展属性;
问题是为什么他们更喜欢IDictionary而不是Hashtable,因此Hashtable也将键作为字符串和对象。唯一的原因是通过选择IDictionary使属性具有多态性


提前感谢。

是的,如果他们将extendedproperties定义为返回哈希表,那么他们将一直使用它,除非他们想破坏所有使用扩展属性的代码

返回一个接口的关键在于,只要该方法继续执行,该方法如何实现并不重要


“唯一的原因是使属性具有多态性”没有抓住要点,不应该这样做的原因应该很少。如果你能返回一个接口,那么大多数情况下你都会返回一个接口,这是一个很好的设计。

是的,如果他们将ExtendedProperties定义为返回哈希表,那么他们就会一直使用它,除非他们想破坏所有使用扩展属性的代码

返回一个接口的关键在于,只要该方法继续执行,该方法如何实现并不重要


“唯一的原因是使属性具有多态性”没有抓住要点,不应该这样做的原因应该很少。如果您可以返回一个接口,那么在大多数情况下,确实可以返回一个接口,这是一个很好的设计。

哈希表是弱类型的,只能返回对象。无论您在字典中存储何种类型,它都是强类型的。

哈希表是弱类型的,只能返回Object。无论您在字典中存储何种类型的内容,字典都是强类型的。

如今,使用哈希表的理由很少<代码>字典在大多数方面都比它好。如果不是这样,您通常可以找到另一个强类型集合,它比这两个集合更好地满足您的需求

  • 类型安全
  • 没有任何严重的装箱和拆箱开销
  • 实现
    IDictionary
    ,它与.NET和第三方代码非常兼容
  • 在许多方面的性能都优于哈希表。请参阅链接:
如果您问为什么要将属性键入为
IDictionary
而不是
Dictionary
,原因有几个

  • 通常认为最好的做法是尽可能多地使用接口,而不是常规类型,尤其是在框架中
  • 可以相当容易地更改接口的实现,但是在不引起与依赖代码的兼容性问题的情况下,很难更改具体类的性质
  • 使用接口,您可以利用
  • 外部代码更可能使用更通用的接口
    IDictionary
    ,而不是具体的类
    Dictionary
    。因此,使用
    IDictionary
    可以让其他开发人员更好地与该属性交互
  • 可能还有很多。这些都是我脑子里想不出来的

如今,使用哈希表的理由很少<代码>字典在大多数方面都比它好。如果不是这样,您通常可以找到另一个强类型集合,它比这两个集合更好地满足您的需求

  • 类型安全
  • 没有任何严重的装箱和拆箱开销
  • 实现
    IDictionary
    ,它与.NET和第三方代码非常兼容
  • 在许多方面的性能都优于哈希表。请参阅链接:
如果您问为什么要将属性键入为
IDictionary
而不是
Dictionary
,原因有几个

  • 通常认为最好的做法是尽可能多地使用接口,而不是常规类型,尤其是在框架中
  • 可以相当容易地更改接口的实现,但是在不引起与依赖代码的兼容性问题的情况下,很难更改具体类的性质
  • 使用接口,您可以利用
  • 外部代码更可能使用更通用的接口
    IDictionary
    ,而不是具体的类
    Dictionary
    。因此,使用
    IDictionary
    可以让其他开发人员更好地与该属性交互
  • 可能还有很多。这些都是我脑子里想不出来的

所以这里的大多数答案都是关于为了一般目的将字典与哈希表进行比较,而不是他们选择特定实现的原因

在那个特定的实现中,您是正确的,它使用object作为返回类型,因此dictionary的强类型优势不可用

在我看来,它可以归结为新旧对比,ArrayList、Hashtable等都是较老的技术,通常不受欢迎,因为它们没有很多特性(在其他答案中描述)。虽然这些功能没有在这种特殊情况下使用,但切换回旧技术并没有很大的好处,它为个人发展提供了一个更好的例子


所以这更多的是“我们现在就是这样做的”

所以这里的大多数答案都是为了一般目的比较字典和哈希表,而不是他们为什么选择那个特定的实现

在那个特定的实现中,您是正确的,它使用object作为返回类型,因此dictionary的强类型优势不可用

在我看来,这可以归结为新旧之争,ArrayList、Hashtable等都是较老的技术,通常都不受欢迎,因为它们没有主机