Почему у стека и очереди нет свойства Capacity, а у List есть?

является ли свойство емкости более полезным в списке, чем в других коллекциях, таких как стек и очередь? Или есть другой способ получить емкость стека или очереди?

3 ответов


я думаю, что причина в том, что List есть Capacity собственность и Stack и Queue не нормальное использование этих типов.

на List довольно часто его заполняют большим набором значений, даже через некоторое время после его создания. Предоставление Capacity свойство (и аргумент конструктора) помогает уменьшить количество перераспределений, которые будут выполняться при добавлении большого количества элементов в список.

Stack и Queue С другой стороны, как правило, не имеют большое количество элементов, добавленных к ним сразу после они были созданы.

предположительно Microsoft решила, что не стоит добавлять Capacity свойство, потому что оно не будет использоваться очень много.

однако обратите внимание, что Queue имеет конструктор, который позволяет указать начальную емкость и так же Стек.

Также обратите внимание, что оба класса также есть TrimExcess() метод, как упоминалось @drch ниже.

поэтому Microsoft подумала, что это будет полезно во время строительства, но не полезно позже - поэтому они только добавили функциональность емкости конструкторам.

(кстати, я только что быстро проверил нашу базу кода, и кажется, что единственный раз, когда мы используем емкость для List на самом деле во время строительства. Так возможно, если бы Microsoft разрабатывала список сейчас, они также могли бы опустить Capacity свойство для списка...)


Stack и Queue являются структурами LIFO и FIFO соответственно.

в обоих случаях вам (как потребителю API) обычно нужно только знать, как поместить данные в структуру и как снова получить данные. Вас не интересует длина структуры данных, только push и pop.

Если вам нужно получить емкость по какой-либо причине (возможно, ограниченный стек/очередь?) тогда, вероятно, было бы лучше скрыть эту деталь от конечного пользователя и реализуйте собственную структуру стека / очереди.


эта информация не предоставляется Stack<T> или Queue<T>. Эта информация даже не хранится явно в этих классах, только неявно в виде длины внутреннего массива.

ваш единственный вариант получить это - использовать отражение для доступа к массиву и получить его длину.