c# - 尽管 list<T> 在内部使用数组(固定的),但它如何动态工作?

标签 c# .net arrays generics

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

最近,我一直在使用 ILspy 查看 .net 程序集的源代码,我发现 List 在内部依赖于一个私有(private)数组,但我无法弄清楚它是如何工作的,所以我想知道它在技术上如何发展还是在我对其进行主操作时在内存中调整大小?

最佳答案

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

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

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

关于c# - 尽管 list<T> 在内部使用数组(固定的),但它如何动态工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18602993/

相关文章:

c# - 如何在.net中创建像String类这样的密封类,这样我们就可以在不创建像string str ="abc"这样的实例的情况下赋值

c# - Struct 隐式默认构造函数与无参数构造函数

c# - C# (.Net) 中的浏览器检测

arrays - 什么是 'Bus error' 以及我的 Fortran 代码中的什么触发了它?

c# - Linq - 在多个(或)条件下左连接

c# - 在一台计算机上启动一个小型服务器应用程序,并将另一个客户端连接到它

c# - 在 C# 中是 bool 读/写原子

python - 从 x,y 坐标查找最近的 x,y,z 点

php - 使用字符串路径设置嵌套数组数据

c# - Unity 中的动态网格计算未正确索引三角形