.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);
Что было бы чище?
РЕДАКТИРОВАТЬ: ответы до сих пор относятся к емкости, которая является чем-то иным, чем предварительное заполнение списка. Например, в только что созданном списке с емкостью 10 нельзя сделать L[2]="somevalue"
РЕДАКТИРОВАТЬ 2: Люди задаются вопросом, почему я хочу использовать списки таким образом, поскольку они не предназначены для использования. Я вижу две причины:
Можно довольно убедительно утверждать, что списки являются массивами «следующего поколения», добавляя гибкость практически без штрафа. Поэтому их следует использовать по умолчанию. Я подчеркиваю, что их не так просто инициализировать.
То, что я сейчас пишу, - это базовый класс, предлагающий функциональные возможности по умолчанию как часть большей структуры. В функциональности по умолчанию, которую я предлагаю, размер списка известен заранее, и поэтому я мог бы использовать массив. Однако я хочу предложить любому базовому классу возможность динамически расширять его, и поэтому я выбираю список.