26

换一种说法:

是否有充分的理由选择松散类型的集合而不是类型安全的集合(HashTable 与 Dictionary)?它们仍然只是为了兼容性吗?

据我了解,泛型集合不仅是类型安全的,而且它们的性能更好。


这是一篇关于该主题的综合文章:使用 C# 2.0 对数据结构进行广泛检查

4

9 回答 9

22

非泛型集合非常过时,已从 Silverlight 和 Live Mesh 中使用的 CoreCLR 中删除。

于 2008-09-11T12:09:30.513 回答
18

COM 可见性也存在问题 - COM 互操作不能与泛型一起使用

于 2008-09-11T13:24:21.173 回答
15

今后只应使用通用集合。避免对集合中的类型进行装箱/拆箱还有一个好处。这是低效的,特别是当您有一组值类型在存储在集合中时转换为 System.Object 时,因此将值存储在堆而不是调用堆栈上。

于 2008-09-11T12:10:00.447 回答
7

关于使用非泛型集合来存储异构的东西集合,您总是可以使用 List<object> 来完成同样的事情。仅出于这个原因,我想说几乎没有理由再接触非通用集合。

例外情况是保持与用其他语言编写的系统的兼容性,或者与以前版本的 .NET 框架保持兼容性,但如果你问我,这是一个非常“前卫”的情况。

于 2008-09-11T12:19:07.727 回答
2

我可以告诉你,集合的 XAML 序列化依赖于它们实现 IList 或 IDictionary,因此非泛型集合将在未来一段时间内与我们同在。

于 2008-09-11T12:30:49.540 回答
1

在某些情况下,您可能需要存储未知类型的对象或多种不同类型的对象,但如果您确实知道要存储的对象的类型,那么我看不出不使用通用版本的理由。

编辑:正如评论的那样,您可以使用List<Object>- doh!

于 2008-09-11T12:09:50.340 回答
1

我不会跳起来说它已经过时或将很快被删除。确实应该避免使用非泛型集合,除非你有理由使用泛型版本。数以千计的遗留(不是那么遗留)代码仍然在(并且将持续数年)支持非泛型集合,如 ArrayLists。由于这些是 .NET 1.0 和 1.1 中唯一的集合,因此它全年都被广泛使用(和滥用)。

我仍然偶尔需要与用 .NET 1.1 编写的返回 IList 对象的旧 O/R 映射器进行交互。我有一个方法可以转换为泛型 List<>,虽然效率不高,但就是这样。

如果您需要将不同的对象存储在同一个数组中(奇怪但可能),您需要一个非泛型集合。装箱和拆箱的罚款无论如何都是你必须支付的。

如果您觉得必须使用它们,请不要害怕使用它们。

于 2008-09-11T12:21:07.130 回答
0

是的,据我了解,它们只是为了与现有产品兼容。您应该始终使用类型安全的版本(即使用 System.Collections.Generic 而不是 System.Collections)。

http://msdn.microsoft.com/en-us/library/ms379564.aspx

于 2008-09-11T12:08:14.400 回答
0

快到 2022 年了,我不得不编写一个 COM Visible Non-Generic 集合类,供一个用 VB6 编写的大型前端商用程序使用——非泛型集合类的这种消费者的主要示例。所以我认为这些类型的类的需求不会很快消失,因为那里仍然有很多活动的 VB6 代码。

同时,使用 ArrayList 和 IList 来支持自定义集合类,并在处理它们之前检查各个项目是否属于您期望的类型,例如

[ComVisible(true)] 公共类 MyNonGenericCollection : ArrayList, IList { private ArrayList myList = new ArrayList();

...

public int Add(object myItem)
{
    if (!(myItem is MyItemClass))
        throw new ArgumentException(nameof(myItem));

    // code to add to the ArrayList

}

于 2021-12-31T12:33:54.053 回答