使用泛型的优点在于它增加了类型安全性 - 您只能放入正确类型的东西,而不需要转换即可得到正确的类型。我所能想到的不使用泛型集合的唯一原因是需要存储一些任意数据。我是否遗漏了什么?在处理集合时不使用泛型的其他原因是什么?
如果您需要存储任意数据,请使用 List<object>
(或类似的类型)。这样明确表明数据是故意不确定的。
除此之外,我不会使用非泛型集合。在将object
引用转换时,我曾经使用过IEnumerable
和IList
,因为无法在编译时确定要强制转换的类型 - 因此非泛型接口有时很有用...但是非泛型类本身则不然。
泛型几乎总是正确的选择。请注意,像 Haskell 和 ML 这样的语言基本上只允许使用这种模型:这些语言中根本没有默认的“object”或“void*”。
我可能不使用泛型的唯一原因是:
当适当的类型在编译时根本不知道时。例如反序列化对象或通过反射实例化对象等情况。
当将使用我的代码的用户不熟悉它们(但愿未来会熟悉)。并非所有工程师都习惯使用它们,特别是在某些更高级的模式中,例如 CRTP。
Microsoft.VisualBasic
命名空间中的非泛型 Collection
存在一些令人讨厌的怪癖和愚蠢之处,在很多方面都相当可怕,但它也有一个独特的特点:如果在枚举期间修改了它,则它是唯一表现出合理语义的集合;如果使用其他集合类型,则执行类似删除满足某个谓词的 Collection 的所有成员的代码可能需要进行重大改写。