ArrayList有什么问题?

最近我问了一个关于SO的问题,提到了c#ArrayList可能用于解决方案。 有人评论说使用arraylist是不好的。 我想更多关于这一点。 我之前从未听过关于arraylists的陈述。 sombody让我快速了解使用arraylists可能出现的性能问题

C#。 达网络-2-

ArrayList的主要问题是使用object – 这意味着您必须对所封装的内容进行强制转换。 它是仿制药前几天的残余,可能只是为了向后兼容。

您没有使用通用列表的ArrayList类型安全性。 性能问题是需要将对象强制转换回原始对象(或者发生隐式装箱)。

每当您使用值类型时都会发生隐式装箱 – 它会在放入ArrayList时被装箱,并在被引用时被取消装箱。

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

如果您正在存储值类型(int,float,double等 – 或任何结构),ArrayList将导致每个存储上的装箱,并在每个元素访问时取消装箱。 这可能是对性能的重大打击。

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

此外,如果您想要存储对象的行为,您始终可以使用List 。 这比ArrayList没有任何缺点,它有一个很大的(IMO)优势:它使你的意图(存储一个无类型的对象)从一开始就清晰。

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

ArrayList不是generics类型,因此它必须将您放置在其中的所有项目存储为对象。 这有两个原因。 首先,在将值类型放入ArrayList时,会强制编译器将值类型设置为引用类型,这可能代价很高。 其次,您现在必须将从数组列表中提取的所有内容都转换出来。 这很糟糕,因为您现在需要确保知道那里有什么对象。

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

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

通用List是首选,因为它是通用的,它提供了额外的类型信息,并且无需添加到其中的box / unbox值类型。

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

所有拳击和拆箱都可能是昂贵且易碎的。 微软在.NET 2.0generics的打字和性能方面做了一些不错的改进。

这里有一些很好的读物:

  • 拳击和拆箱价值类型:你需要知道什么? 在http://www.c-sharpcorner.com/uploadfile/stuart_fujitani/boxnunbox11192005055746am/boxnunbox.aspx

  • 性能:ArrayList vs List <> , url为http://allantech.blogspot.com/2007/03/performance-arraylist-vs-list.html