Различия между этими двумя инициализациями List<char> в C#
Я прохожу обучение на 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'};
2 ответа
Второй код использует инициализатор коллекции, это эквивалентно этому:
var vowels2 = new List<char>();
vowels2.Add('a');
vowels2.Add('e');
...
Значение емкости управляется внутри списка и увеличивается при необходимости. В первом коде вы даете конструктору массив, чтобы длина была известна, а емкость установлена на 5. Во втором коде элементы добавляются один за другим, и емкость увеличивается на основе этого, поэтому он и отличается.
Дополнительные элементы, которые вы видите, это элементы внутреннего массива в List<T>
класс, который инициализируется значениями по умолчанию. Когда у вас есть массив структур (char
является структурой) все значения инициализируются значениями по умолчанию, например, если вы создадите массив из 10 точек, они будут инициализированы равными 0. Для char это то же самое, просто значение по умолчанию \0
,
В конце оба кода делают одно и то же, в вашем списке нет лишних элементов. То, что вы видите в отладчике, это детали реализации.
Первый передает массив, который список использует в качестве своего резервного хранилища. Отсюда вместимость 5.
Второй - это синтетический сахар для создания экземпляра с использованием конструктора без параметров, а затем вызовите метод с именем add для каждого элемента (называемый инициализатором коллекции). IIRC исходная емкость, установленная, когда используемый конструктор по умолчанию равен 4, что впоследствии удваивается до размера 8, когда добавляется 5-й элемент.