.NET предлагает общий контейнер списка, производительность которого почти идентична (см. раздел "Производительность массивов против списка" ). Однако при инициализации они совершенно разные.
Массивы очень легко инициализируются значением по умолчанию, и по определению они уже имеют определенный размер:
string[] Ar = new string[10];
Это позволяет безопасно назначать случайные элементы, например:
Ar[5]="hello";
со списком вещей сложнее. Я вижу два способа сделать ту же инициализацию, ни то, что вы бы назвали элегантным:
List<string> L = new List<string>(10);
for (int i=0;i<10;i++) L.Add(null);
или
string[] Ar = new string[10];
List<string> L = new List<string>(Ar);
Что было бы более чистым способом?
EDIT: ответы до сих пор относятся к емкости, что является чем-то иным, чем предварительное заполнение списка. Например, в списке, созданном только с емкостью 10, нельзя сделать L[2]="somevalue"
РЕДАКТИРОВАТЬ 2: Люди задаются вопросом, почему я хочу использовать списки таким образом, поскольку это не так, как они предназначены для использования. Я вижу две причины:
-
Можно было вполне убедительно утверждать, что списки - это массивы следующего поколения, добавляющие гибкость практически без штрафа. Поэтому их следует использовать по умолчанию. Я указываю, что они могут быть не так легко инициализироваться.
-
То, что я сейчас пишу, - это базовый класс, предлагающий функции по умолчанию как часть более крупной структуры. В функциональности по умолчанию, которую я предлагаю, размер списка известен в расширенном, и поэтому я мог бы использовать массив. Тем не менее, я хочу предложить любому базовому классу возможность динамически расширять его, и поэтому я выбираю список.