C# 这两个列表声明之间有什么区别? var mylist1=新列表(5); var mylist2=新列表(新浮点[5]);

C# 这两个列表声明之间有什么区别? var mylist1=新列表(5); var mylist2=新列表(新浮点[5]);,c#,list,C#,List,mylist1的容量为5。mylist2也得到5分。这两者之间的区别是什么?我应该使用哪一个呢?第一个声明创建了一个具有大小为5的底层数组的列表 第二个声明将数据从传递的数组复制到列表中的基础数组 因此,第二项宣言需要: 创建一个空数组 将该数组中的值复制到另一个数组 由于它也更难读取(将空数组传递给列表构造函数有什么意义?),因此实际上没有任何理由使用第二个数组而不是第一个数组 重载的原因是允许您使用另一个数组或可枚举的值预先填充列表。例如: var mylist1 = new List&

mylist1的容量为5。mylist2也得到5分。这两者之间的区别是什么?我应该使用哪一个呢?

第一个声明创建了一个具有大小为5的底层数组的列表

第二个声明将数据从传递的数组复制到列表中的基础数组

因此,第二项宣言需要:

  • 创建一个空数组
  • 将该数组中的值复制到另一个数组
由于它也更难读取(将空数组传递给列表构造函数有什么意义?),因此实际上没有任何理由使用第二个数组而不是第一个数组

重载的原因是允许您使用另一个数组或可枚举的值预先填充列表。例如:

var mylist1 = new List<float>(5);
var mylist2 = new List<float>(new float[5]);
var list=新列表(可枚举范围(1100));

(当然,即使这样,您通常也会使用
Enumerable.Range(1100).ToList()
代替:)

首先创建一个容量为5但为空的列表。也就是说,如果访问myList1[3],您会收到一个错误。
第二种方法创建一个已经包含5个元素的float列表。每个元素的值为0.0,即浮点的默认值

第一个元素为空,第二个元素中有5个值。通过放置一个断点并查看内部,很容易看到。首先设置容量,然后设置第二项。右键单击类型并选择“转到定义”,可以很容易地看到这两个独立构造函数的文档或者,当光标在打字机上时,按F12可以轻松回答您的所有问题。@OguzOzgul,这就是元数据,要访问文档,它是F1,而构造函数中有闪烁的光标。除了post之外:第一个列表的
Count
属性等于0,而第二个属性等于5。@Luaan thx是答案,但是在处理动态数组时,预先声明容量有什么意义?如果我声明容量为500而不是5,有什么意义?我的意思是,在mylist1中没有任何东西像mylist2数组值那样被创建。在C#中处理动态数组时,我不理解这种容量问题。如果事先知道对象的数量,则@Lyrk的性能会更好。减少阵列的重新分配。然而,当有这么少的数字时,它就过时了,比如你的例子中的5。没有真正的动态数组。列表只是模拟一个。@Lyrk好吧,你需要了解
list
是如何工作的-它使用一个内部数组来保存它的所有项。比如说,它从一个数组中的20个项开始。当您尝试添加第21项时,它需要扩展该数组-但这意味着创建一个全新的数组,并复制旧的数组。如果您要添加500项,这意味着您将进行大量的重新分配和复制,这可能会对性能造成严重的损失。如果您事先知道您将拥有大约500件物品,那么使用该容量是提高性能的一个简单选择。
var list = new List<int>(Enumerable.Range(1, 100));