今天,您好我绊了与事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中它说:
初始化List类的新实例,该实例为空并具有指定的初始容量。
我以为这意味着列表具有我传入的初始大小。为什么不这样呢?
提前致谢!
初始容量是指列表维护的内部阵列存储。
如果您希望容纳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>
源代码,以检查一下它在内部的工作方式:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句