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

Che*_*hen 38 .net c# generics arraylist obsolete

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

编辑让我们以List<T>一个例子来说,它提供了所有函数ArrayList,并且它是强类型的.那么我们什么时候需要使用ArrayList?也许有时它会有更好的表现?我不知道.如果你能告诉我一些特别的东西,我感激不尽ArrayList.

Jon*_*eet 47

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

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

  • 我希望.net编译器有一个"遗留框架元素警告"标志.即如果今天从头开始重新构建框架4和相关语言,这些元素将会消失. (7认同)
  • @Mene:是的,我也很乐意使用像[EnforceBackwardCompatibility = false]这样的限制性更强的选项.这可能是MS可以发布的一组fxcop规则. (2认同)

Mar*_*ell 15

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

没有充分理由,你不应该在新代码中使用它.


xan*_*tos 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);
Run Code Online (Sandbox Code Playgroud)

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

如果你问"你会使用任何非泛型集合",我的回答会有所不同.该Hashtable中有一个有趣的特性:

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

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

  • 你的答案就像一个圆圈.你想要做什么?它是否过时了? (9认同)
  • @xanatos:古董收藏家会选择'70汽车. (5认同)
  • @Danny - 也许古董代码的收集者会收集COBOL和ArrayLists. (4认同)