1

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

当我调试时,两者都显示为 5。第一个显示容量为 5,但第二个显示容量为 8?当我查看 Raw View > Non-public-members > _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'};
4

2 回答 2

3

第二个代码使用集合初始化器,它相当于:

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

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

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

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

于 2017-03-25T22:55:36.987 回答
2

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

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

于 2017-03-25T22:53:53.563 回答