你什么时候不使用通用collections?
使用generics的优点是它增加了类型的安全性 – 你只能放入正确类型的东西,并且你可以在不需要演员的情况下获得正确的类型。 我不能使用generics集合的唯一原因是你需要存储一些任意数据。 我错过了什么吗? 在处理集合时,还有哪些其他原因不使用generics?
如果需要存储任意数据,请使用List
(或其他)。 然后绝对清楚它是故意任意的。
除此之外,我不会将非generics集合用于任何事情。 我在转换object
引用时使用了IEnumerable
和IList
,并且在编译时不知道要将它IList
转换的类型 – 所以非generics接口有时很有用……但不是非generics类本身。
显而易见的另一个原因是使用不使用generics集合的代码(可能是遗留的)。
你可以在.NET本身看到这种情况。 System.Windows.Form.Control.Controls
不是通用的,也不是System.Web.UI.Control.Controls
。
generics几乎总是使用正确的东西。 请注意,像Haskell和ML这样的语言基本上只允许该模型:在这些语言中根本没有默认的“object”或“void *”。
我可能不使用generics的唯一原因是:
-
在编译时根本不知道相应的类型。 像反序列化对象或通过reflection实例化对象之类的东西。
-
当使用我的代码的用户(还)不熟悉它们时。 并非所有工程师都习惯使用它们,特别是在一些更高级的模式中,例如CRTP 。
主要优点是对于值类型的generics集合没有装箱或拆箱惩罚。 如果使用ildasm.exe检查il,可以看到这一点。 通用容器为值类型提供了更好的性能,并为参考类型提供了更小的性能改进。
使用generics的类型差异可能会让你失望,但大多数情况下你应该使用generics集合。 没有一个真正的理由可以避免它们,以及世界上所有避免像ArrayList这样的非类型集合的原因。
这是一个答案: 从Hashtable
到Dictionary
的变化 。
我认为你需要考虑的一件事是,generics集合并不总是替代非generics集合。 例如,Dictionary
Microsoft.VisualBasic
命名空间中的非genericsCollection
有一些恼人的怪癖和愚蠢,并且在很多方面都非常糟糕,但它也有一个独特的特性:它是唯一一个展示合理语义的集合,如果它在列举; 如果使用某些其他集合类型,则执行类似删除集合中满足某个谓词的所有成员的代码可能需要被重写。