c# – 如果列表内部使用数组(已修复),列表如何动态工作?

前端之家收集整理的这篇文章主要介绍了c# – 如果列表内部使用数组(已修复),列表如何动态工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经了解了c#中的泛型和数组(我知道c中使用指针的动态数组),我也知道数组是固定大小的,所以我们不能在初始化后改变它的大小,我们必须分配一个新的然后复制……

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

解决方法

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

由于这种行为,将项目附加到List被描述为amortized O(1)操作:由于后备数组中有可用空间,因此大多数附加将花费恒定时间,但是一些附加将触发数组重新分配并占用大量内容更多时间.

从List的公共接口也可以看出实现的方式:有一个Capacity属性可以控制列表可以保存多少项而无需调整大小,还有一个constructor可以让你预先保留一些指定的容量(有助于避免不必要的调整大小操作)当你事先知道列表将至少达到一定的大小时).

猜你在找的C#相关文章