你什么时候不使用通用collections?

使用generics的优点是它增加了类型的安全性 – 你只能放入正确类型的东西,并且你可以在不需要演员的情况下获得正确的类型。 我不能使用generics集合的唯一原因是你需要存储一些任意数据。 我错过了什么吗? 在处理集合时,还有哪些其他原因不使用generics?

如果需要存储任意数据,请使用List (或其他)。 然后绝对清楚它是故意任意的。

除此之外,我不会将非generics集合用于任何事情。 我在转换object引用时使用了IEnumerableIList ,并且在编译时不知道要将它IList转换的类型 – 所以非generics接口有时很有用……但不是非generics类本身。

显而易见的另一个原因是使用不使用generics集合的代码(可能是遗留的)。

你可以在.NET本身看到这种情况。 System.Windows.Form.Control.Controls不是通用的,也不是System.Web.UI.Control.Controls

generics几乎总是使用正确的东西。 请注意,像Haskell和ML这样的语言基本上允许该模型:在这些语言中根本没有默认的“object”或“void *”。

我可能不使用generics的唯一原因是:

  1. 在编译时根本不知道相应的类型。 像反序列化对象或通过reflection实例化对象之类的东西。

  2. 当使用我的代码的用户(还)不熟悉它们时。 并非所有工程师都习惯使用它们,特别是在一些更高级的模式中,例如CRTP 。

主要优点是对于值类型的generics集合没有装箱或拆箱惩罚。 如果使用ildasm.exe检查il,可以看到这一点。 通用容器为值类型提供了更好的性能,并为参考类型提供了更小的性能改进。

使用generics的类型差异可能会让你失望,但大多数情况下你应该使用generics集合。 没有一个真正的理由可以避免它们,以及世界上所有避免像ArrayList这样的非类型集合的原因。

这是一个答案: 从HashtableDictionary的变化 。

我认为你需要考虑的一件事是,generics集合并不总是替代非generics集合。 例如,Dictionary 不能简单地插入Hashtable的实例。 它们在许多可以并且将破坏程序的场景中具有非常不同的行为。 在这两个集合之间切换迫使一个优秀的程序员检查用例,以确保差异不会咬他们。

Microsoft.VisualBasic命名空间中的非genericsCollection有一些恼人的怪癖和愚蠢,并且在很多方面都非常糟糕,但它也有一个独特的特性:它是唯一一个展示合理语义的集合,如果它在列举; 如果使用某些其他集合类型,则执行类似删除集合中满足某个谓词的所有成员的代码可能需要被重写。