跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

c# array 和 arraylist 的区别

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
没有编译期类型检查,错误只能拖到运行时才发现 频繁装箱/拆箱带来明显性能损耗(尤其在循环或 大数据 量场景)
foreach
遍历时若未声明为
object
,也会因 隐式转换 失败崩溃 Array 和 ArrayList 的实际能力差异远超“能不能扩容” 表面上看,
ArrayList
支持
Add()
、
RemoveAt()
,而
int[]
只能靠
array[i] = value
赋值——但这掩盖了更关键的底层事实: C函数速查手册(CHM版) C函数速查手册(CHM版) 下载
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[]
,编译期就锁死类型:
List numbers = 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 映射中,替换时得同步检查反射调用和类型判断分支。

相关文章