何时不应使用通用集合?

5

使用泛型的优点在于它增加了类型安全性 - 您只能放入正确类型的东西,而不需要转换即可得到正确的类型。我所能想到的不使用泛型集合的唯一原因是需要存储一些任意数据。我是否遗漏了什么?在处理集合时不使用泛型的其他原因是什么?


我将'container'改为'collection',因为在C#中它们被称为'collection'。 - George Stocker
这里有很多好的答案,谢谢大家。 - 1800 INFORMATION
8个回答

17

如果您需要存储任意数据,请使用 List<object>(或类似的类型)。这样明确表明数据是故意不确定的。

除此之外,我不会使用非泛型集合。在将object引用转换时,我曾经使用过IEnumerableIList,因为无法在编译时确定要强制转换的类型 - 因此非泛型接口有时很有用...但是非泛型类本身则不然。


7
明显的另一个原因是在处理可能没有使用泛型集合的代码(可能是旧版代码)。
你可以在.NET本身中看到这种情况。System.Windows.Form.Control.Controls不是泛型,System.Web.UI.Control.Controls也不是泛型。

3

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

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

  1. 当适当的类型在编译时根本不知道时。例如反序列化对象或通过反射实例化对象等情况。

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


2
主要优势在于使用值类型的泛型集合时不会有装箱或拆箱的惩罚。如果您使用ildasm.exe查看il,就可以看到这一点。对于值类型来说,泛型容器提供更好的性能,而对于引用类型,则提供较小的性能改进。

2

泛型中的类型变化可能会让你犯错,但大多数情况下你应该使用泛型集合。没有真正避免它们的好理由,而且有很多理由要避免像ArrayList这样的无类型集合。


1

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

你能举个例子吗?我想不出为什么哈希表和字典<object,object>不能互换。(除了一些语法上的变化) - Jason Coyne
实际上,经典的例子是当找不到项目时的行为。HashTable 返回 null,而 Dictionary 抛出异常。 - 1800 INFORMATION
嗯,那肯定是对的,但我仍然会把它视为一种语法问题。一个简单的扩展方法,如果键不存在就返回null,可以让你重新获得哈希功能。 - Jason Coyne

0
< p > Microsoft.VisualBasic 命名空间中的非泛型 Collection 存在一些令人讨厌的怪癖和愚蠢之处,在很多方面都相当可怕,但它也有一个独特的特点:如果在枚举期间修改了它,则它是唯一表现出合理语义的集合;如果使用其他集合类型,则执行类似删除满足某个谓词的 Collection 的所有成员的代码可能需要进行重大改写。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接