最近我问了一个关于SO的问题,提到了可能使用c#ArrayList解决方案。有人评论说使用数组列表是不好的。我想更多地了解这一点。我之前从来没有听说过关于数据列表的这个声明。 可以sombody救上来的可能性能问题,以加快对使用的ArrayListArrayList有什么错误?
C#。 .NET-2
最近我问了一个关于SO的问题,提到了可能使用c#ArrayList解决方案。有人评论说使用数组列表是不好的。我想更多地了解这一点。我之前从来没有听说过关于数据列表的这个声明。 可以sombody救上来的可能性能问题,以加快对使用的ArrayListArrayList有什么错误?
C#。 .NET-2
与ArrayList中的主要问题是使用object
- 这意味着你必须转换为从无论你是封装。它是泛型的前几天剩下的时间,可能只是为了向后兼容。
您没有使用ArrayList的类型安全性,您使用泛型列表。性能问题是需要将对象转换回原始(或者有隐式装箱)。引用时放时到ArrayList和拆箱将盒装 - 无论你使用一个值类型
隐拳击会发生。
问题不仅在于性能,还在于可读性和正确性。自泛型进来以来,这个对象已经过时,只会在.NET 1.0/1.1代码中需要。
类型安全也 – 2010-07-24 19:46:13
@俄罗斯凸轮 - 感谢您的评论。答更新你评论;) – Oded 2010-07-24 19:48:58
ArrayList不是泛型类型,因此它必须将所有放置在其中的项目存储为对象。这有两个原因是不好的。首先,当在ArrayList中放入值类型时,您会强制编译器将值类型放入可能代价高昂的引用类型中。其次,你现在必须将你从数组列表中拉出的所有东西都施放。这是不好的,因为你现在需要确定你知道那里有什么对象。
List避免了这些问题,因为它是用适当的类型构造的。 例如:
List<int> ints = new List<int>();
ints.Add(5); //no boxing
int num = ints[0]; // no casting
如果你存储的值类型(整数,浮点,双等 - 或任何结构),ArrayList中会造成每个存储装箱和拆箱的每一个元素访问。这可能会对性能产生重大影响。
另外,ArrayList完全没有类型安全性。由于所有内容都是以“对象”的形式存储的,因此作为开发人员,您需要承担额外的负担,以确保其安全。
另外,如果你想要存储对象的行为,你总是可以使用List<object>
。这对ArrayList没有任何不利之处,它有一个很大的优点:它使你的意图(存储一个无类型的对象)从一开始就清楚。
ArrayList
真的只存在,且只能被用于.NET 1.1的代码。在.NET 2 +中真的没有理由使用它。
所有的拳击和拆箱可能是昂贵和脆弱的。微软在.NET 2.0泛型的键入和性能方面做了一些很好的改进。
这里有一些很好写着:
忽略任何性能问题,我不能想到一个情况下,你更喜欢一个ArrayList,因为上一个通用的一个2.0。 – 2010-07-24 19:46:27
即使您需要的对象的列表,你可以使用列表
@DOK - 泛型的.Net中引入2.0 – STW 2010-07-24 19:48:52