You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:58:00