C#中这两个List <char>初始化之间的差异

时间:2017-03-25 22:50:28

标签: c# list object-initialization

我正在进行一些C#培训,并试图了解这两个List<char>初始化之间的区别。我没有太多运气找到一个好的解释。

当我调试时,两者都显示为5.第一个显示容量为5但第二个显示容量为8?当我看Raw View&gt;非公开会员&gt; _items,额外[5],[6],[7]显示值0,'\0'

我真的很感激一些帮助,了解差异以及为什么/何时应该使用每一个。提前谢谢。

var vowels1 = new List<char>(new char[] {'a', 'e', 'o', 'u', 'i'});

var vowels2 = new List<char>(){'a', 'e', 'o', 'u', 'i'};

2 个答案:

答案 0 :(得分:3)

第二个代码使用collection initializer,它等同于:

var vowels2 = new List<char>();
vowels2.Add('a');
vowels2.Add('e');
...

容量值在列表内部进行管理,并在需要时增加。在第一个代码中,您为构造函数提供了一个数组,因此长度是已知的,容量设置为5.在第二个代码中,项目逐个添加,容量会根据它增加,这就是为什么它不同。

你看到的额外项目是List<T>类中内部数组的项目,它们被初始化为默认值。当你有一个结构数组(char是一个结构)时,所有的值都被初始化为默认值,例如,如果你创建一个10个整数的数组,它们将被初始化为0.这对于char来说是相同的,只是默认值值为\0

最后两个代码都做同样的事情,你的列表没有任何额外的项目。您在调试器中看到的是实现细节。

答案 1 :(得分:2)

第一个传递列表用作其后备存储的数组。因此容量为5。

第二个是使用无参数构造函数实例化的合成糖,然后使用每个元素(称为集合初始化程序)调用名为add的方法。 IIRC当使用的默认构造函数为4时初始容量设置,当添加第5个元素时,后续加倍到大小为8。