Они не совсем эквивалентны.
В первом случае вы создаете новый массив, то мимоходом, что в List<T>
конструктор, который будет создавать свой собственный внутренний массив того же размера и ссылаться на CopyTo
метод массива источников, чтобы скопировать элементы из исходный массив и его внутренний массив.
Во втором случае вы строите новый List<T>
с первоначально пустым массивом (размера _defaultCapacity = 4
), а затем, вызывая Add
метода, Лист, который может вызвать внутренний массив будет изменен несколько раз, как это добавление элементов.
Таким образом, в первом случае, Вы получаете выгоду от не имея размер внутреннего массива в списке, так же как вызов потенциально более эффективный CopyTo
метод, а не итеративного Add
, за счет того, чтобы создать два массивы в памяти сразу.
Вот одна вещь, которую вы могли бы сделать, чтобы избежать создания двух массивов и убедитесь, что вы не должны изменять размер внутреннего массива в Листом:
var aList = new List<string>(3) { "elem1", "elem2", "elem3" };
я не обязательно рекомендовать для производства кода, из-за волшебная константа 3
, но опять же, у вас уже есть три другие магические константы.
компилятор не будет оптимизировать его, поскольку он реализовал функциональность List (у него есть конструктор с параметром IEnumerable). Поэтому он будет преобразован, и ничего плохого не произойдет. –
[http://www.dotnetperls.com/initialize-list](http://www.dotnetperls.com/initialize-list) говорит интересные вещи. Моя вторая вариация компилируется в ту, что говорит Шломо (Add calls). Вариант массива может быть более оптимальным: «копирует внешний массив во внутренний буфер списка во время выполнения, что позволяет избежать ненужного изменения размера буфера списка». –
Итак, нет никакого ненужного создания массива, как я утверждаю в своем вопросе. –