6

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

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

4

1 回答 1

22

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

由于这种行为,将项目附加到 aList被描述为摊销O(1) 操作:由于后备数组中有可用空间,大多数附加将花费恒定时间,但一些附加将触发数组重新分配并花费更多时间时间。

从 的公共接口中也可以明显看出实现方式List:有一个Capacity属性可以控制列表可以容纳多少项目而无需调整大小,还有一个构造函数可以让您预先保留一些指定的容量(有助于避免不必要的调整大小操作,当您事先知道该列表将至少有一定的大小)。

于 2013-09-03T23:24:46.923 回答