C# 中这两个 List<char> 初始化的区别

Differences between these two List<char> initializations in C#

我正在接受一些 C# 培训,并试图了解这两个 List<char> 初始化之间的区别。我没能找到很好的解释。

当我调试时,两者都显示计数为 5。第一个显示容量为 5,而第二个显示容量为 8?当我查看 Raw View > Non-public-members > _items 时,额外的 [5],[6],[7] 显示值 0,'[=14=]'

如果能帮助我理解差异,我将不胜感激,why/when我应该使用每一个。提前致谢。

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

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

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

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

第二个代码使用collection initializer,相当于这样:

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

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

您看到的额外项目是 List<T> class 中的内部数组项目,这些项目被初始化为默认值。当你有一个结构数组(char 是一个结构)时,所有值都被初始化为默认值,例如,如果你创建一个包含 10 个整数的数组,它们将被初始化为 0。对于 char 也是一样的,只是默认值值为 [=13=].

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