.NET中的非通用集合是否已过时?
换句话说:
是否有充分的理由选择类型安全的集合而不是类型安全的集合(HashTable与Dictionary)?他们是否仍然只是出于兼容性考虑?
据我了解,泛型集合不仅是类型安全的,而且它们的性能也更好。
这是有关该主题的综合文章:使用C2.0的数据结构的广泛检查。
解决方案
回答
是的,据我了解,它们只是为了与现有产品兼容而存在。我们应该始终使用类型安全版本(即,在System.Collections上使用System.Collections.Generic)。
http://msdn.microsoft.com/en-us/library/ms379564.aspx
回答
非通用集合已经过时,以至于它们已从Silverlight和Live Mesh中使用的CoreCLR中删除。
回答
在某些情况下,我们需要存储未知类型的对象,或者需要存储多种不同类型的对象,但是如果我们确实知道要存储的对象的类型,那么我看不到不使用通用版本的原因。
编辑:正如我们所评论的,我们可以只使用List <Object>
doh!
回答
今后只应使用通用集合。避免在集合中对类型进行装箱/拆箱还有一个好处。这是没有效率的,尤其是当我们有一个值类型的集合存储在集合上时,这些值类型在转换为System.Object时,因此将这些值存储在堆中,而不是在调用堆栈中。
回答
关于使用非泛型集合存储东西的异类集合,我们始终可以使用List <object>来完成同一件事。仅出于这个原因,我想说几乎没有理由再次触及非通用集合。
例外情况是保持与用其他语言编写的系统的兼容性,或者与.NET Framework的早期版本的兼容性,但是如果我们问我,那是相当"前卫"的情况。
回答
我不会说那是过时的,或者很快就会被删除。
的确,除非有理由不使用通用版本,否则应避免使用非通用集合。成千上万行的遗留(而不是遗留的)代码仍在浮动(并将持续数年),以支持ArrayLists等非通用集合。由于这些是.NET 1.0和1.1中唯一的集合,因此它在一年中被广泛使用(和滥用)。
我仍然偶尔仍需要与用.NET 1.1编写的返回IList对象的旧O / R映射器进行交互。我有一个方法可以转换为通用List <>,效率不高,但事实就是如此。
而且,如果我们需要将不同的对象存储在同一数组中(奇怪但可行),则需要一个非通用的集合。无论如何,装箱和拆箱的罚款都是我们必须支付的。
如果我们认为必须使用它们,请不要害怕使用它们。
回答
我可以告诉我们,集合的XAML序列化依赖于它们实现IList或者IDictionary,因此非泛型集合将在未来一段时间内出现。
回答
COM可见性也存在问题COM互操作不能与泛型一起使用