经过深思熟虑并研究ArrayList
的实现,我个人真的想说它已经过时了,我没有理由在2.0之后使用这个类。但由于它没有标记为[Obsolete]
,是否有任何我不知道的用法,比使用泛型类更好?如果是,请举个例子。感谢。
编辑我们以List<T>
为例,它提供ArrayList
的所有功能,并且是强类型的。那么我们什么时候需要使用ArrayList
?也许有时它会有更好的表现?我不知道。如果你能告诉我ArrayList
的特别之处,我感激不尽。
答案 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 + Dictionary
或ConcurrentDictionary
(但您必须对其进行基准测试)