何时在c#中使用ArrayList而不是array []?

ins*_*ite 35 c# arrays arraylist

我经常使用ArrayList而不是'正常' array[].

当我使用时ArrayList,我觉得好像在欺骗(或者懒惰),什么时候可以使用ArrayList一个阵列?

Bob*_*Bob 61

数组是强类型的,并且可以作为参数使用.如果您知道集合的长度并且已修复,则应使用数组.

ArrayLists不是强类型的,每次Insertion或Retrial都需要一个强制转换来恢复原始类型.如果您需要一个方法来获取特定类型的列表,ArrayLists就会失败,因为您可以传入包含任何类型的ArrayList.ArrayLists在内部使用动态扩展的数组,因此在内部数组达到其容量时也会扩展内部数组的大小.

你真正想要使用的是通用列表List<T>.这具有Array和ArrayLists的所有优点.它是强类型的,它支持可变长度的项目.

  • ArrayList不使用LinkedList作为内部数据结构!它使用向量,该向量是在添加/插入/删除操作时动态调整大小的数组. (5认同)

Tam*_*ege 14

除了鲍勃和弗雷德里克的回应,我想指出虽然数组有协方差,但通用列表却没有.例如,类型的阵列MyChildClass[]可以容易地浇铸MyParentClass[],而List<MyChildClass>不能浇铸List<MyParentClass>,至少不能直接.

如果你需要协方差,要么使用数组,要使用LINQ的Cast()方法或其他方法单独转换每个项目或等待C#4.


Mar*_*ell 7

另一个想法是变异; array(T[])完全可变,无法保护.List<T>没有提供任何有用的扩展点,但像Collection<T>(或许多其他IList<T>实现)这样的东西允许你添加代码,例如,在添加项目之前检查项目; 同样,您可以拥有只读IList<T>实现,这对于需要不变性的线程安全非常有用.

我倾向于在内部方法逻辑(可能作为局部变量),作为params参数,或在一些高度优化的情况下使用数组,我知道项目的长度,我知道代码选择不改变它(作为一个私人领域).除此之外,List<T>等往往更常见,因为它们在添加/删除项目时的开销要小得多.


Mic*_*rdt 5

除非代码的那部分绝对是性能关键的,否则使用ArrayList非常好.

  • 好吧,1.1也许......你应该一般瞄准2.0中的List <T> (2认同)