c# – 为什么列表(Int32)的.Count的初始大小为0?

c# – 为什么列表(Int32)的.Count的初始大小为0?,第1张

概述嗨,今天我偶然发现了List< T>(Int32).我认为以下示例中的行为是相同的: 1. var myList = new List<string>(5);myList[1] = string.Empty; 2. var myArray= new string[5];myArray[1] = string.Empty; 第一个示例失败,我得到’System.ArgumentOutOfRang 嗨,今天我偶然发现了List< T>(Int32).我认为以下示例中的行为是相同的:

1.

var myList = new List<string>(5);myList[1] = string.Empty;

2.

var myArray= new string[5];myArray[1] = string.Empty;

第一个示例失败,我得到’System.ArgumentOutOfRangeException’.第二个例子效果很好.

所以我在列表上尝试了.Count并且它表示它为0,当我把.Length放在数组时它说5.

在MSDN中它说:

Initializes a new instance of the List class that is empty and has
the specifIEd initial capacity.

我认为这意味着列表具有我传入的初始大小.为什么不是这种情况?

提前致谢!

解决方法 初始容量是指列表维护的内部阵列存储.

如果您希望保留100个项目并指定100作为初始容量,则可以避免内部调整数组大小的开销(实际上,列表可以避免创建新数组并复制前一个数组的值…).

也许现在你已经意识到列表(以及许多其他集合类型)只是数组的抽象,以提供特定的语义:列表,集合,字典……

例如,具有100个初始容量项的列表集合可能会将项添加到已有100个索引/槽的内部数组:

int[] array1 = new int[100];array1[0] = 1;// until...array1[99] = 2;

…虽然没有提供良好的容量,但它可能需要在内部处理100个项目的插入:

int[] array2 = new int[3];array2[0] = 1;array2[1] = 2;array2[2] = 3;int[] array3 = new int[6];array2.copyTo(array3);array3[3] = 4;array3[4] = 5;array3[5] = 6;int[] array4 = new int[9];array3.copyTo(array4);array4[6] = 7;array4[7] = 8;array4[8] = 9;// and so on...

作为列表存储的整个内部数组已经进行了最小预留,但这只是一个实现细节.如果您已经知道要添加到列表中的项目数量,那么提供初始容量会更好.

请注意,初始容量不会修复整个列表的最大容量.这将破坏列表的目的和语义:通过插入顺序(FIFO,先进先出)排序的对象集合.达到容量后,内部阵列将再次调整大小.

此外,由于较高级别的列表仅被描述为对象集合,因此您不能指望提供初始容量可以提供对内部存储索引的访问.存在集合对象的内部数组的事实是一个实现细节,您需要依赖于高级细节:

// Above reason is why you CAN'T access myList[1]var myList = new List<string>(5);myList[1] = string.Empty;

更多详情

希望现在大多数.NET Framework源代码都可以在线获得.您可以查看List< T>源代码,以检查自己内部如何工作:

> List<T> source code

总结

以上是内存溢出为你收集整理的c# – 为什么列表(Int32)的.Count的初始大小为0?全部内容,希望文章能够帮你解决c# – 为什么列表(Int32)的.Count的初始大小为0?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1224564.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存