C#中动态数组与List的区别:二者是否为同一概念?
在C#中,动态数组和List的关系到底是啥?
嘿,这个问题问得特别实在,刚好我天天跟C#集合打交道,咱们把这俩的关系掰扯明白:
首先得明确两个核心点:
- “动态数组”是一个抽象概念:指的是那种可以自动扩容、不用提前固定大小的数组结构,和C#里固定长度的
T[](静态数组)相对。 List<T>是C#里动态数组的主流实现,但严格来说,二者不是完全划等号的——因为还有个老伙计叫ArrayList。
1. 日常开发里,“动态数组”就是List<T>的俗称
咱们平时写代码说的“动态数组”,99%指的就是泛型的List<T>。它底层用静态数组存数据,当你添加元素超过当前容量时,会自动扩容(通常是把容量翻倍),完全不用手动管大小,用起来特别方便:
// 初始化一个空的动态数组(List<int>) List<int> numbers = new List<int>(); // 随便加元素,不用操心大小 numbers.Add(10); numbers.Add(20); numbers.Add(30); // 甚至可以直接转成静态数组 int[] staticArray = numbers.ToArray();
对比一下静态数组,你就懂为啥List<T>叫动态数组了:
// 静态数组必须提前指定大小,不能直接加元素 int[] staticNumbers = new int[2]; staticNumbers[0] = 10; staticNumbers[1] = 20; // 这行直接报错:索引超出范围 // staticNumbers[2] = 30;
2. 还有个老版的动态数组:ArrayList
在C#泛型出来之前(.NET 2.0以前),大家用ArrayList作为动态数组的实现。它也是动态扩容的,但有个大问题:它存储的是object类型,存值类型会有装箱拆箱的性能损耗,而且类型不安全——你可以在同一个ArrayList里存整数、字符串、对象,取的时候还要强制转换,特别容易出bug:
ArrayList oldDynamicArray = new ArrayList(); oldDynamicArray.Add(10); oldDynamicArray.Add("Hello"); // 啥类型都能存,不安全 // 取元素必须强制转换,不小心就会抛异常 int num = (int)oldDynamicArray[0]; string str = (string)oldDynamicArray[1];
现在ArrayList基本被淘汰了,没人愿意跟类型不安全的代码打交道,所以大家说的动态数组默认就是List<T>。
总结一下
- 如果你说的“动态数组”是抽象概念:那
List<T>是它的一种具体实现,二者是概念和实现的关系,不是完全不同。 - 如果是日常开发语境:“动态数组”就是
List<T>的俗称,二者可以划等号。 - 只有当特指老版的
ArrayList时,“动态数组”才和List<T>是不同的东西,但这种情况现在很少见了。
内容的提问来源于stack exchange,提问作者Noman Ajmal
相关产品推荐
相关产品推荐

