C# IDictionary与哈希表-
很多人都在谈论这个问题,但我不太理解这个概念。IDictionary是泛型的,其类型安全性等 当我深入研究EntityFrameworkv5时,我看到一个属性在LogEntry类中声明如下C# IDictionary与哈希表-,c#,.net,entity-framework,C#,.net,Entity Framework,很多人都在谈论这个问题,但我不太理解这个概念。IDictionary是泛型的,其类型安全性等 当我深入研究EntityFrameworkv5时,我看到一个属性在LogEntry类中声明如下 private IDictionary<string, object> extendedProperties; 私有IDictionary扩展属性; 问题是为什么他们更喜欢IDictionary而不是Hashtable,因此Hashtable也将键作为字符串和对象。唯一的原因是通过选择IDic
private IDictionary<string, object> extendedProperties;
私有IDictionary扩展属性;
问题是为什么他们更喜欢IDictionary而不是Hashtable,因此Hashtable也将键作为字符串和对象。唯一的原因是通过选择IDictionary使属性具有多态性
提前感谢。是的,如果他们将extendedproperties定义为返回哈希表,那么他们将一直使用它,除非他们想破坏所有使用扩展属性的代码 返回一个接口的关键在于,只要该方法继续执行,该方法如何实现并不重要
“唯一的原因是使属性具有多态性”没有抓住要点,不应该这样做的原因应该很少。如果你能返回一个接口,那么大多数情况下你都会返回一个接口,这是一个很好的设计。是的,如果他们将ExtendedProperties定义为返回哈希表,那么他们就会一直使用它,除非他们想破坏所有使用扩展属性的代码 返回一个接口的关键在于,只要该方法继续执行,该方法如何实现并不重要
“唯一的原因是使属性具有多态性”没有抓住要点,不应该这样做的原因应该很少。如果您可以返回一个接口,那么在大多数情况下,确实可以返回一个接口,这是一个很好的设计。哈希表是弱类型的,只能返回对象。无论您在字典中存储何种类型,它都是强类型的。哈希表是弱类型的,只能返回Object。无论您在字典中存储何种类型的内容,字典都是强类型的。如今,使用哈希表的理由很少<代码>字典在大多数方面都比它好。如果不是这样,您通常可以找到另一个强类型集合,它比这两个集合更好地满足您的需求
- 类型安全
- 没有任何严重的装箱和拆箱开销
- 实现
,它与.NET和第三方代码非常兼容IDictionary
- 在许多方面的性能都优于哈希表。请参阅链接:
IDictionary
而不是Dictionary
,原因有几个
- 通常认为最好的做法是尽可能多地使用接口,而不是常规类型,尤其是在框架中
- 可以相当容易地更改接口的实现,但是在不引起与依赖代码的兼容性问题的情况下,很难更改具体类的性质
- 使用接口,您可以利用
- 外部代码更可能使用更通用的接口
,而不是具体的类IDictionary
。因此,使用Dictionary
可以让其他开发人员更好地与该属性交互IDictionary
- 可能还有很多。这些都是我脑子里想不出来的
- 类型安全
- 没有任何严重的装箱和拆箱开销
- 实现
,它与.NET和第三方代码非常兼容IDictionary
- 在许多方面的性能都优于哈希表。请参阅链接:
IDictionary
而不是Dictionary
,原因有几个
- 通常认为最好的做法是尽可能多地使用接口,而不是常规类型,尤其是在框架中
- 可以相当容易地更改接口的实现,但是在不引起与依赖代码的兼容性问题的情况下,很难更改具体类的性质
- 使用接口,您可以利用
- 外部代码更可能使用更通用的接口
,而不是具体的类IDictionary
。因此,使用Dictionary
可以让其他开发人员更好地与该属性交互IDictionary
- 可能还有很多。这些都是我脑子里想不出来的
所以这更多的是“我们现在就是这样做的”所以这里的大多数答案都是为了一般目的比较字典和哈希表,而不是他们为什么选择那个特定的实现 在那个特定的实现中,您是正确的,它使用object作为返回类型,因此dictionary的强类型优势不可用 在我看来,这可以归结为新旧之争,ArrayList、Hashtable等都是较老的技术,通常都不受欢迎,因为它们没有主机