C# 什么';ArrayList有那么糟糕吗?

C# 什么';ArrayList有那么糟糕吗?,c#,arraylist,C#,Arraylist,我正在努力提升公司的平台,在我的研究过程中,我遇到了很多人的评论,他们说应该避免使用ArrayList。然而,他们从来没有解释过为什么它们如此糟糕,我也找不到任何关于它们为什么如此糟糕的文章;只是ArrayList是C#中应该避免的一个类 原因是它不是通用的,因此您可以在其中存储任何对象,从而破坏类型安全性。 改用列表。,因为它们不是强类型的。它们是一个可以储存任何东西的袋子。这意味着在检索元素时必须强制转换。这也意味着在存储和检索值时可能涉及到装箱/拆箱,也可能不涉及装箱/拆箱。它们不是通用的

我正在努力提升公司的平台,在我的研究过程中,我遇到了很多人的评论,他们说应该避免使用ArrayList。然而,他们从来没有解释过为什么它们如此糟糕,我也找不到任何关于它们为什么如此糟糕的文章;只是
ArrayList
是C#中应该避免的一个类

原因是它不是通用的,因此您可以在其中存储任何
对象
,从而破坏类型安全性。

改用
列表

,因为它们不是强类型的。它们是一个可以储存任何东西的袋子。这意味着在检索元素时必须强制转换。这也意味着在存储和检索值时可能涉及到装箱/拆箱,也可能不涉及装箱/拆箱。

它们不是通用的。
列表
是完全相同的东西,但它是通用的。这意味着您要确保对象都是公共类型,并且该约束由编译器强制执行。它还避免了值类型的装箱。

与其说是可怕,不如说是痛苦。把它们想象成一张清单,有点像一张纸

因此,您必须添加大量规则来强制集合中的一致性,并在“任何地方”使用它们,或者处理由于没有一致性而导致的错误,“任何地方”

所以有很多额外的代码,或者你交叉你的手指真的很紧,希望没有“傻瓜”程序员把你不能处理的东西放进去


如果你的收藏可以包含任何东西,那么就坚持使用它,尽管我个人认为如果它包含了,几乎肯定会有某种主要的设计缺陷。

因为它们在C#中不是通用的。另外,如果你想读一些东西,就不能在Silverlight中使用它。msdn告诉你他们为什么引入它们是的,我明白了。对性能的影响如何?HashSet的性能和ArrayList相比如何?取决于您使用它做什么。装箱和拆箱太贵了。@user2460328根本不应该比较它们。
列表
数组列表
完全相同,只是更好。如果想要基于列表的结构,可以使用
列表
。是否使用
哈希集
列表
(这是一个有效的列表)的问题与本次讨论完全不同,它基于您拥有的数据类型和您计划如何使用它。这是一个很好的解释和回答,但更清楚的是,ArrayList允许您在单个ArrayList中同时存储多种类型的对象。这意味着您可以将字符串、int、object等全部存储在同一个ArrayList中,因此您必须在存储之前确保存储的数据类型一致,或者在退出时进行类型检查。无论哪种方式,程序员都要做更多的工作。泛型更容易,因为它们自动执行类型安全。如果您希望在一个列表中包含多种类型的对象,该怎么办?你正在写一个“小行星”游戏,你想把所有的小行星、子弹、玩家太空船等储存在一个游戏对象列表中吗?假设一个arraylist就可以了,您可以通过循环arraylist并执行if(arraylist[i]是SomeInterface)…来运行操作。SLC一个泛型仍然更好。要么将其存储为列表游戏对象,要么创建一个提供公共类型的类结构。请参阅我上面关于避免手动处理类型安全性的评论。@SLC在这种情况下,您可以使用
List
List
List
ArrayList
真的有什么不同吗?