代码之家  ›  专栏  ›  技术社区  ›  fishhead

ArrayList怎么了?

  •  20
  • fishhead  · 技术社区  · 16 年前

    最近我在上问了一个问题,提到了可能使用c#ArrayList作为解决方案。有人评论说使用arraylist是不好的。我想了解更多。我以前从未听过关于ArrayList的这种说法。

    c#。净-2

    6 回复  |  直到 16 年前
        1
  •  37
  •   Oded    16 年前

    object -这意味着你必须在你封装的东西之间来回转换。它是泛型出现之前的遗留问题,可能只是为了向后兼容。

    您没有与泛型列表相同的类型safety with ArrayList。性能问题在于需要将对象强制转换回原始对象(或者发生隐式装箱)。

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

        2
  •  14
  •   Reed Copsey    16 年前

    如果存储的是值类型(int、float、double等-或任何结构),ArrayList将对每个存储进行装箱,并对每个元素访问进行解装箱。这可能对性能造成重大影响。

    另外,如果你 存储对象的行为,您可以随时使用 List<object> . 与ArrayList相比,它没有缺点,而且它有一个很大的优点(IMO):它从一开始就让您的意图(存储非类型化对象)变得清晰。

    ArrayList 真的只存在,并且应该只用于.NET1.1代码。实际上没有理由在.NET2+中使用它。

        3
  •  4
  •   Matthew Manela    16 年前

    列表避免了这些问题,因为它是用正确的类型构造的。

    List<int> ints =  new List<int>();
    ints.Add(5); //no boxing
    int num = ints[0]; // no casting
    
        4
  •  3
  •   Lee    16 年前

    List<T> 是首选的,因为它是泛型的,它提供了额外的类型信息,并且不需要对添加到其中的值类型进行装箱/取消装箱。

        5
  •  2
  •   recursive    16 年前

    除了性能问题之外,还需要将错误从运行时转移到编译时。从中检索的强制转换对象 ArrayList s必须在运行时发生,任何类型错误都将在执行期间发生。使用泛型 List<> 在编译时检查所有类型。

        6
  •  1
  •   AMissico    16 年前

    所有的装箱和拆箱都是昂贵而易碎的。微软在.NET2.0泛型的类型和性能方面做了一些很好的改进。

    以下是一些好的读物: