ArrayList是已淘汰的非泛型动态集合,Array是固定长度的原生数组;现代C#中应使用List替代ArrayList,以获得类型安全、零装箱和高性能。

Array 是固定长度的原生数组,ArrayList 是已淘汰的非泛型动态集合
直接说结论:在现代 C#(.NET Core / .NET 5+)中,ArrayList 已被明确标记为「遗留类型」,官方文档建议彻底避免使用;而 Array(如 int[]、string[])仍是高性能、类型安全的基础结构。两者根本不在同一使用层级上——一个是语言级语法糖,一个是早期框架补丁。
为什么 ArrayList 在编译时“不报错”,但运行时总出问题?
因为 ArrayList 内部只存 object,所有值类型(int、bool、DateTime)都会被自动装箱,取出来时又必须显式拆箱。一旦类型写错,就抛 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 赋值——但这掩盖了更关键的底层事实:
2013年07月06日 V1.60 升级包更新方式:admin文件夹改成你后台目录名,然后补丁包里的所有文件覆盖进去。1.[新增]后台引导页加入非IE浏览器提示,后台部分功能在非IE浏览器下可能没法使用2.[改进]淘客商品管理 首页 列表页 内容页 的下拉项加入颜色来区别不同项3.[改进]后台新增/修改淘客商品,增加淘宝字样的图标和天猫字样图标改成天猫logo图标4.[改进]为统一名称,“分类”改
-
Array在内存中严格连续,索引访问是 O(1) 且 CPU 缓存友好;ArrayList底层虽用object[]实现,但每次扩容(如从 4→8)都要 重新分配内存 + 逐个复制元素,可能触发 GC -
Array支持多维(int[,] grid = new int[3,4])、锯齿(int[][])、甚至非零下界(Array.CreateInstance(typeof(int), new int[]{5}, new int[]{1}));ArrayList只有一维且下界永远是 0 -
Array的Length是只读属性;ArrayList的Count表示当前元素数,Capacity才是实际分配容量——二者常不一致,容易误判内存占用
该用什么替代 ArrayList?别犹豫,直接上 List
如果你需要「可变长度 + 类型安全 + 零装箱」,List 就是唯一答案。它和 ArrayList 接口相似,但底层是泛型数组 T[],编译期就锁死类型:
Listnumbers = new List (); numbers.Add(100); // OK,无装箱 numbers.Add("abc"); // 编译报错:不能将 string 转为 int int x = numbers[0]; // OK,无需强制转换
-
List和ArrayList的方法名几乎一样(Add、RemoveAt、Insert),迁移成本极低 - 性能接近原生数组,比
ArrayList快 2–5 倍(实测含值类型操作) - .NET 6+ 中
List还支持AsSpan()、Clear()不清空容量等优化,ArrayList完全不支持
真正要留意的,是那些还在维护的老项目里残留的 ArrayList ——它们往往藏在序列化逻辑、COM 互操作或旧版 ORM 映射中,替换时得同步检查反射调用和类型判断分支。







