贝利信息

c# array 和 arraylist 的区别

日期:2026-01-09 00:00 / 作者:煙雲
ArrayList是已淘汰的非泛型动态集合,Array是固定长度的原生数组;现代C#中应使用List替代ArrayList,以获得类型安全、零装箱和高性能。

Array 是固定长度的原生数组,ArrayList 是已淘汰的非泛型动态集合

直接说结论:在现代 C#(.NET Core / .NET 5+)中,ArrayList 已被明确标记为「遗留类型」,官方文档建议彻底避免使用;而 Array(如 int[]string[])仍是高性能、类型安全的基础结构。两者根本不在同一使用层级上——一个是语言级语法糖,一个是早期框架补丁。

为什么 ArrayList 在编译时“不报错”,但运行时总出问题?

因为 ArrayList 内部只存 object,所有值类型(intboolDateTime)都会被自动装箱,取出来时又必须显式拆箱。一旦类型写错,就抛 InvalidCastException

ArrayList list = new ArrayList();
list.Add(42);          // 装箱成 object
list.Add("hello");

int x = (int)list[0];  // OK
int y = (int)list[1];  // 运行时报错:无法将 string 转为 int

Array 和 ArrayList 的实际能力差异远超“能不能扩容”

表面上看,ArrayList 支持 Add()RemoveAt(),而 int[] 只能靠 array[i] = value 赋值——但这掩盖了更关键的底层事实:

该用什么替代 ArrayList?别犹豫,直接上 List

如果你需要「可变长度 + 类型安全 + 零装箱」,List 就是唯一答案。它和 ArrayList 接口相似,但底层是泛型数组 T[],编译期就锁死类型:

List numbers = new List();
numbers.Add(100);     // OK,无装箱
numbers.Add("abc");   // 编译报错:不能将 string 转为 int
int x = numbers[0];   // OK,无需强制转换

真正要留意的,是那些还在维护的老项目里残留的 ArrayList ——它们往往藏在序列化逻辑、COM 互操作或旧版 ORM 映射中,替换时得同步检查反射调用和类型判断分支。