【问题标题】:What's Wrong with an ArrayList?ArrayList 有什么问题?
【发布时间】:2011-03-20 14:07:43
【问题描述】:

最近我问了一个关于 SO 的问题,其中提到了可能使用 c# ArrayList 作为解决方案。有人评论说使用数组列表是不好的。我想更多地了解这一点。我以前从未听说过关于数组列表的这种说法。 有人可以让我快速了解使用 arraylists 可能出现的性能问题

c#。 .net-2

【问题讨论】:

  • 忽略任何性能问题,我想不出自 2.0 以来您更喜欢 ArrayList 而不是通用的情况。
  • 即使需要对象列表,也可以使用 List
  • @DOK - .Net 2.0 中引入了泛型
  • @DOK:泛型是在 2.0 中添加的,我没有关注您的评论,请解释一下?

标签: c# .net generics collections arraylist


【解决方案1】:

ArrayList 的主要问题是它使用了object——这意味着你必须对你封装的任何东西进行转换。它是泛型之前的遗留物,可能只是为了向后兼容。

ArrayList 没有泛型列表所具有的类型安全性。性能问题在于需要将对象转换回原始对象(或发生隐式装箱)。

每当您使用值类型时,都会发生隐式装箱 - 将其放入 ArrayList 时将被装箱,而在引用时将被取消装箱。

问题不仅在于性能,还在于可读性和正确性。自从泛型出现以来,这个对象已经过时了,只需要在 .NET 1.0/1.1 代码中。

【讨论】:

  • @Russ Cam - 感谢您的评论。在您发表评论时更新了答案;)
【解决方案2】:

如果您要存储值类型(int、float、double 等 - 或任何结构),ArrayList 将导致对每个存储进行装箱并在每个元素访问时取消装箱。这可能会对性能造成重大影响。

此外,ArrayList 完全缺乏类型安全性。由于所有内容都存储为“对象”,因此作为开发人员,您有额外的负担来保证它的安全。

另外,如果你想要存储对象的行为,你总是可以使用List<object>。与 ArrayList 相比,它没有任何缺点,它有一个很大的 (IMO) 优势:它使您的意图(存储无类型对象)从一开始就明确。

ArrayList 确实只存在,并且应该只用于 .NET 1.1 代码。确实没有理由在 .NET 2+ 中使用它。

【讨论】:

    【解决方案3】:

    ArrayList 不是泛型类型,因此它必须将您放入其中的所有项目存储为对象。这很糟糕,有两个原因。首先,在将值类型放入 ArrayList 时,您会强制编译器将值类型装箱为引用类型,这可能会很昂贵。其次,您现在必须转换从数组列表中拉出的所有内容。这很糟糕,因为您现在需要确保知道里面有什么对象。

    List 避免了这些问题,因为它是用正确的类型构造的。 例如:

    List<int> ints =  new List<int>();
    ints.Add(5); //no boxing
    int num = ints[0]; // no casting
    

    【讨论】:

      【解决方案4】:

      首选泛型 List&lt;T&gt;,因为它是泛型的,它提供了额外的类型信息,并且无需对添加到其中的值类型进行装箱/拆箱。

      【讨论】:

      • @DOK - List&lt;T&gt; 存在于 .net 2.0 中
      • 是否有任何与 vb.net Collection 类型等效的泛型,它允许迭代器删除当前项目(假设项目的内容包含标识密钥的信息)?字典将是一个很好的匹配,除了最后一点。
      【解决方案5】:

      除了性能问题之外,还有将错误从运行时转移到编译时的问题。从ArrayLists 检索到的转换对象必须在运行时发生,并且任何类型错误都会在执行期间发生。使用泛型 List&lt;&gt; 在编译期间检查所有类型。

      【讨论】:

      • 使用 List 代替带有整数的 ArrayList 大大提高了性能。
      • 这不是性能问题。然而,性能问题是答案的一部分。
      • 来自 OP:“能否让我快速了解使用 arraylists 可能出现的性能问题”
      • @tster:我看到了有问题的帖子,主要反对意见似乎与性能无关。尽管如此,我还是改变了措辞。
      • 也许“性能”这个词不合适,英语不是我的第一语言,我并不总是将“性能”这个词视为与速度相关的维度。
      【解决方案6】:

      所有装箱和拆箱都可能既昂贵又脆弱。 Microsoft 在 .NET 2.0 泛型的类型和性能方面做了一些不错的改进。

      这里有一些不错的读物:

      【讨论】:

        猜你喜欢
        • 2015-06-08
        • 2020-04-29
        • 2013-09-02
        • 1970-01-01
        • 2014-06-29
        • 2021-06-09
        • 2014-08-12
        • 2010-12-23
        相关资源
        最近更新 更多