【发布时间】:2010-09-08 13:18:40
【问题描述】:
换个说法:
是否有充分的理由选择松散类型的集合而不是类型安全的集合(HashTable 与 Dictionary)?它们仍然只是为了兼容性吗?
据我了解,泛型集合不仅类型安全,而且性能更好。
这是关于该主题的综合文章:An Extensive Examination of Data Structures Using C# 2.0。
【问题讨论】:
标签: .net generics collections
换个说法:
是否有充分的理由选择松散类型的集合而不是类型安全的集合(HashTable 与 Dictionary)?它们仍然只是为了兼容性吗?
据我了解,泛型集合不仅类型安全,而且性能更好。
这是关于该主题的综合文章:An Extensive Examination of Data Structures Using C# 2.0。
【问题讨论】:
标签: .net generics collections
快到 2022 年了,我不得不编写一个 COM Visible Non-Generic 集合类,供一个用 VB6 编写的大型前端商用程序使用——非泛型集合类的这种消费者的主要示例。所以我认为这些类型的类的需求不会很快消失,因为那里仍然有很多活动的 VB6 代码。
同时,使用 ArrayList 和 IList 来支持自定义集合类,并在处理它们之前检查各个项目是否属于您期望的类型,例如
[ComVisible(true)] 公共类 MyNonGenericCollection:ArrayList,IList { 私有 ArrayList myList = new ArrayList();
...
public int Add(object myItem)
{
if (!(myItem is MyItemClass))
throw new ArgumentException(nameof(myItem));
// code to add to the ArrayList
}
【讨论】:
在某些情况下,您可能需要存储未知类型的对象或多种不同类型的对象,但如果您确实知道要存储的对象的类型,那么我看不出有理由不使用通用版本。
编辑:正如评论所说,您可以使用List<Object> - doh!
【讨论】:
COM 可见性也存在问题 - COM 互操作不能与泛型一起使用
【讨论】:
我可以告诉你,集合的 XAML 序列化依赖于它们实现 IList 或 IDictionary,因此非泛型集合将在未来一段时间内与我们同在。
【讨论】:
我不会跳槽说它已经过时或将很快被删除。 确实应该避免使用非泛型集合,除非您有理由不不使用泛型版本。数以千计的遗留(不是那么遗留)代码仍然在(并且将持续数年)支持非泛型集合,如 ArrayLists。由于这些是 .NET 1.0 和 1.1 中的唯一集合,因此全年都被广泛使用(和滥用)。
我仍然偶尔需要与用 .NET 1.1 编写的返回 IList 对象的旧 O/R 映射器进行交互。我有一个方法可以转换为通用 List,它效率不高,但就是这样。
如果您需要将不同的对象存储在同一个数组中(奇怪但可能),您将需要一个非泛型集合。装箱和拆箱的罚款是你无论如何都必须支付的。
如果你觉得有必要,不要害怕使用它们。
【讨论】:
如果您需要将不同的对象存储在同一个数组中(很奇怪但可能),您将需要一个非泛型集合。呃,不。创建一个专门用于 Object 的通用集合就可以了。
关于使用非泛型集合来存储异构的东西集合,你总是可以使用 List
这方面的例外是保持与用其他语言编写的系统或与以前版本的 .NET 框架的兼容性,但如果你问我,这是一个非常“前卫”的情况。
【讨论】:
以后只应使用泛型集合。避免对集合中的类型进行装箱/拆箱还有一个好处。这是低效的,尤其是当您有一组值类型在存储在集合中时转换为 System.Object 时,因此将值存储在堆上而不是调用堆栈上。
【讨论】:
System.Collections.BitArray。通用等价物?相比之下,List<bool> 似乎非常节省空间。
非泛型集合非常过时,已从 Silverlight 和 Live Mesh 中使用的 CoreCLR 中删除。
【讨论】:
是的,据我了解,它们只是为了与现有产品兼容。您应该始终使用类型安全的版本(即使用 System.Collections.Generic 而不是 System.Collections)。
【讨论】: