C# 如何列出<;T>;动态工作,尽管它在内部使用数组(它是固定的)?

C# 如何列出<;T>;动态工作,尽管它在内部使用数组(它是固定的)?,c#,.net,arrays,generics,C#,.net,Arrays,Generics,我已经知道c#中的泛型和数组(我知道c++中使用指针的动态数组),而且我知道数组的大小是固定的,所以初始化后我们不能更改它的大小,我们必须分配一个新数组,然后复制 最近,我一直在使用ILspy查看.net程序集的源代码,我发现列表在内部依赖于一个私有数组,但我不知道它是如何工作的,所以我想知道,当我对它进行主操作时,它在技术上是如何增长的或在内存中是如何调整大小的?列表分配一个数组t[]具有一定大小,并将其用作其项目的存储,直到阵列填满为止。当需要添加新项时,列表会分配一个新的、更大的数组,并将

我已经知道c#中的泛型和数组(我知道c++中使用指针的动态数组),而且我知道数组的大小是固定的,所以初始化后我们不能更改它的大小,我们必须分配一个新数组,然后复制

最近,我一直在使用ILspy查看.net程序集的源代码,我发现列表在内部依赖于一个私有数组,但我不知道它是如何工作的,所以我想知道,当我对它进行主操作时,它在技术上是如何增长的或在内存中是如何调整大小的?

列表
分配一个数组
t[]
具有一定大小,并将其用作其项目的存储,直到阵列填满为止。当需要添加新项时,列表会分配一个新的、更大的数组,并将所有项从旧数组复制到新数组。然后可以毫无问题地添加新项

由于这种行为,将项追加到
列表中被描述为一个O(1)操作:由于备份数组中有可用空间,大多数追加将花费固定的时间,但一些追加将触发数组重新分配,并且花费更多的时间

List
的公共界面上也可以看出实现方式:有一个属性可以控制列表在不调整大小的情况下可以容纳多少项,还有一个属性可以让您预先保留一些指定的容量(当您事先知道列表将至少达到一定大小时,可避免不必要的调整大小操作)。

请参阅