39

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

EDITList<T>个例子,它提供了 的所有功能ArrayList,并且是强类型的。那么我们什么时候需要使用ArrayList呢?也许有时它有更好的表现?我不知道。如果你能给我看一些特别的东西,我将不胜感激ArrayList

4

3 回答 3

49

我认为它应该被认为对于新代码实际上已经过时,但是没有令人信服的理由将它标记为过时并在所有在 2.0 发布之前编写的代码中创建警告。

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

于 2011-02-21T07:13:07.223 回答
15

实际上,它已从 Silverlight 中完全删除 - 所以意图就在那里。据推测,对于常规.NET 来说,现有的旧代码太多了,这些代码ArrayList已经过时了,特别是因为很多人在运行时都会遇到警告即错误。

你不应该在没有充分理由的情况下在新代码中使用它。

于 2011-02-21T07:09:28.817 回答
5

它本身并不是“过时的”。作为 80 世纪70 年代 早期的 90 年代汽车,它已经“过时”了。如果我必须在 aList<Object>和 an之间进行选择,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 是线程安全的,可供多个读取线程和单个写入线程使用。当只有一个线程执行写入(更新)操作时,多线程使用是线程安全的,如果写入器序列化到哈希表,则允许无锁读取。

所以有些地方 aHashtable应该比 alock + Dictionary或 a更好ConcurrentDictionary(但你必须对其进行基准测试)

于 2011-02-21T07:04:45.757 回答