【问题标题】:What's so bad about ArrayLists? [closed]ArrayLists 有什么不好? [关闭]
【发布时间】:2013-06-21 15:16:41
【问题描述】:

我正在努力增强我公司的平台,在我的研究期间,我遇到了很多来自人们说应该避免使用 ArrayLists 的 cmets。但是,他们从来没有给出太多解释,我也找不到任何关于他们为什么如此糟糕的文章。

【问题讨论】:

标签: c# arraylist


【解决方案1】:

“Arraylists”(有时也称为“vectors”)是非常好的数据结构;只是ArrayList是C#中应该避免的类。

原因是它不是通用的,因此您可以在其中存储任何 object,从而破坏类型安全。
请改用List<T>

【讨论】:

  • 这是一个很好的解释和答案,但更清楚一点是 ArrayList 将允许您同时在单个 ArrayList 中存储多种类型的对象。这意味着您可以将字符串、整数、对象等都存储在同一个 ArrayList 中,因此您必须在存储之前确保存储的数据类型是一致的,或者在出路时进行类型检查。无论哪种方式,对程序员来说都是更多的工作。泛型更简单,因为它们会自动进行类型安全。
  • 如果您想在一个列表中包含多种类型的对象怎么办?您正在编写“小行星”游戏,并且想要将所有小行星、子弹、玩家太空船等存储在单个游戏对象列表中?大概一个数组列表就可以了,您可以通过循环遍历 ArrayList 并执行 if (ArrayList[i] Is SomeInterface)...?
  • SLC 通用的还是会更好。将其存储为 List GameObjects 或创建提供通用类型的类结构。请参阅我上面关于避免手动处理类型安全的评论。
  • @SLC 在这种情况下,您可以使用List<object>List<ISomeInterface>
  • List<object>ArrayList 真的有什么不同吗?
【解决方案2】:

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

【讨论】:

  • 是的,我明白了。对性能有什么影响? HashSet 的性能与 ArrayList 相比如何?
  • 取决于你用它做什么。大量装箱和拆箱很昂贵。
  • @user2460328 你根本不应该比较它们。 ListArrayList 完全相同,但更好。如果你想要一个基于列表的结构,你可以使用List。是否使用HashSetList(这是一个有效的)的问题与本次讨论完全不同,并且取决于您拥有的数据类型以及您打算如何使用它。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    与其说是痛苦不如说是可怕。把它们想象成列表,有点像。

    因此,您必须添加许多规则来强制集合中的一致性并“无处不在”使用它们,或者处理因没有一致性而导致的错误,“无处不在”

    所以有很多额外的代码,或者你真的很紧张,希望没有“愚蠢的”程序员会在里面放一些你无法处理的东西。

    如果你的收藏可以包含任何东西,那就坚持下去,尽管我个人认为如果是这样,几乎可以肯定存在某种重大的设计缺陷。

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2020-01-04
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      相关资源
      最近更新 更多