为什么ArrayList没有标记为[已废弃]?

时间:2011-02-21 06:56:40

标签: c# .net generics arraylist obsolete

经过深思熟虑并研究ArrayList的实现,我个人真的想说它已经过时了,我没有理由在2.0之后使用这个类。但由于它没有标记为[Obsolete],是否有任何我不知道的用法,比使用泛型类更好?如果是,请举个例子。感谢。

编辑我们以List<T>为例,它提供ArrayList的所有功能,并且是强类型的。那么我们什么时候需要使用ArrayList?也许有时它会有更好的表现?我不知道。如果你能告诉我ArrayList的特别之处,我感激不尽。

3 个答案:

答案 0 :(得分:47)

我认为新代码应该被认为是有效的过时,但没有令人信服的理由将其标记为过时并在2.0版本发布之前编写的所有代码中创建警告。

根据我的经验,大多数被Microsoft标记为过时的类型和成员在某些方面都是非常危险的,如果您仍然使用它们的代码库,那么应该真正修复它们。虽然使用ArrayList是痛苦的并且(至少在理论上)倾向于在执行时而不是编译时发现与类型相关的错误,但类型确实很好地完成了它的工作......通常没有令人信服的理由来改变现有的代码。当我已经碰巧在使用ArrayList的代码区域时,我通常会考虑这种变化,而不是主动寻找它的每一种用法。

答案 1 :(得分:15)

实际上它已完全从Silverlight中移除 - 所以意图就在那里。据推测,只有太多旧的现有常规 .NET代码使用ArrayList来废弃它,特别是因为许多人运行警告错误。

如果没有正当理由,不应在新代码中使用它。

答案 2 :(得分:5)

本身并非“过时”。作为 '70 '80 90年代早期的汽车,它已经“过时了”。如果我必须在List<Object>ArrayList之间做出选择,我会使用一个非常小的可能性我会使用一个ArrayList ...忘掉它...它没有实现IEnumerable<Object>,所以要使用Linq,我必须使用OfType<Object>()

举个例子:

var aaa = new ArrayList();
var aaaa = aaa.OfType<object>().Where(p => p != null);

var bbb = new List<object>;
var bbbb = bbb.Where(p => p != null);

有人最终赞成我的回复,所以我会添加一些内容: - )

如果你问“你会使用任何非泛型集合吗”我的回答会有所不同。 Hashtable有一个有趣的属性:

  

Hashtable是线程安全的,可供多个读取器线程和单个写入线程使用。当只有一个线程执行写(更新)操作时,它对多线程使用是线程安全的,如果编写器被序列化为Hashtable,则允许无锁读取。

因此有些地方Hashtable应优于lock + DictionaryConcurrentDictionary(但您必须对其进行基准测试)