为什么ArrayList没有标记?

经过深入的思考和研究ArrayList的实现,我个人真的很想说已经过时了,我没有理由在2.0之后使用这个类 。 但是因为它没有被标记为[Obsolete] ,有什么用法我不知道,比使用generics类更好吗? 如果是的话,请举个例子。 谢谢。

编辑让我们以List<T>为例,它提供了ArrayList所有function,并且是强types的。 那么我们什么时候需要使用ArrayList呢? 也许有时它有更好的performance? 我不知道。 我很感激你能否给我看一些ArrayList特别之处。

我认为新代码应该被认为已经过时,但是没有任何理由将其标记为过时,并且在2.0发布之前编写的所有代码中都会产生警告。

根据我的经验,大多数已经被微软过时的types和成员在某些方面是非常危险的,如果你仍然有一个使用它们的代码库,那么它应该是固定的。 虽然使用ArrayList是痛苦的,并且(至less在理论上)很容易发现在执行时的types相关的错误,而不是编译时间,但types的function已经足够好了……通常没有改变现有代码的强制理由。 当我碰巧正在使用一个使用ArrayList的代码区域时,通常会考虑这种变化,而不是主动地去查找它的每一个用法。

事实上,它完全从Silverlight中删除 – 所以意图就在那里。 据推测,对于常规的 .NET,现有的代码太多了,使用ArrayList过时了,特别是因为很多人运行时会出现警告错误。

没有很好的理由,你不应该在新的代码中使用它。

它本身并不“过时”。 90 年代早期的'70 '80车已经“过时”了。 如果我不得不在一个List<Object>和一个ArrayList之间进行select,那么就有一个非常非常小的可能性,我将使用一个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有一个有趣的属性:

散列表是线程安全的,可供多个阅读器线程和单个写入线程使用。 当只有一个线程执行写入(更新)操作时,对于multithreading的使用是线程安全的,只要将写入器串行化到Hashtable,允许无locking的读取。

所以有些地方的Hashtable应该比lock + Dictionary或者ConcurrentDictionary更好(但是你必须对它进行基准testing)