经过深思熟虑并查看了 ArrayList
的实现后,我个人真的想说它已经过时了,2.0版本之后我没有理由使用这个类。但是既然它没有被标记为 [Obsolete]
,是否有一些我不知道的用法比使用通用类更好?如果有,请举例说明。谢谢。
编辑以List<T>
为例,它提供了 ArrayList
的所有功能,并且它是强类型的。那么我们什么时候需要使用 ArrayList
呢?也许有时它的性能更好吗?我不知道。如果您能给我展示一些 ArrayList
的特殊之处,我将不胜感激。
经过深思熟虑并查看了 ArrayList
的实现后,我个人真的想说它已经过时了,2.0版本之后我没有理由使用这个类。但是既然它没有被标记为 [Obsolete]
,是否有一些我不知道的用法比使用通用类更好?如果有,请举例说明。谢谢。
编辑以List<T>
为例,它提供了 ArrayList
的所有功能,并且它是强类型的。那么我们什么时候需要使用 ArrayList
呢?也许有时它的性能更好吗?我不知道。如果您能给我展示一些 ArrayList
的特殊之处,我将不胜感激。
我认为它应该被视为新代码中无效的,但没有强制性的理由来标记它为过时并在2.0发布之前编写的所有代码中创建警告。
根据我的经验,微软标记为过时的大多数类型和成员在某些方面是活动风险,如果你仍然有一个使用它们的代码库,真的应该进行修复。虽然使用ArrayList
很痛苦(至少在理论上)容易在执行时发现与类型相关的错误而不是编译时,但这个类型足够好地完成了工作......通常没有强制性的理由来更改现有的代码。通常只有当我已经在使用ArrayList
的代码区域工作时才会考虑这种更改,而不是积极寻找每一种用法。
实际上,它已完全从Silverlight中移除 - 因此意图是明确的。大概是因为有太多使用ArrayList
的旧的现有代码,以至于使它过时在正常的.NET中,尤其是因为很多人运行时开启了警告视为错误。
没有充分的理由,您不应在新代码中使用它。
它本身并不是“过时的”。它在70年代、80年代早期已经“过时”了。如果我必须在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。
因此,在某些情况下,Hashtable
应该比 lock + Dictionary
或 ConcurrentDictionary
更好(但您需要对其进行基准测试)。
[Obsolete]
属性标记它?”能够回答那个问题的人非常有限。 - Cody Gray