我正在进行一些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'};
答案 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。