为什么Stack <t>和Queue <t>在List <t>时没有容量属性?</t> </t> </t>

时间:2013-06-27 08:34:45

标签: c# list stack queue capacity

容量属性在List中比在Stack和Queue等其他集合中更有用吗?或者是否有其他方法可以获得堆栈或队列的容量?

3 个答案:

答案 0 :(得分:5)

我认为List具有Capacity属性且StackQueue的原因不是这些类型的正常用法不同。

对于List,使用大量值填充它是相当常见的,甚至在创建它之后的一段时间。提供Capacity属性(和构造函数参数)有助于减少在向列表中添加大量项目时要执行的重新分配的数量。

另一方面,

StackQueue不会在创建后立即添加大量项目。

据推测,微软认为不值得添加Capacity属性,因为它不会被广泛使用。

但请注意Queue does have a constructor that allows you to specify an initial capacityso does Stack

另请注意,这两个类也有TrimExcess()方法,如下面的@drch所述。

因此微软认为它在构建时很有用,但以后没用 - 所以他们只向构造函数添加了容量功能。

(顺便提一下,我刚刚通过我们的代码库进行了快速检查,似乎我们唯一一次使用List的容量实际上是在构建时。所以也许微软现在正在设计List ,他们也可能省略List的Capacity属性...)

答案 1 :(得分:3)

StackQueue分别是LIFO和FIFO结构。

在这两种情况下,您(作为API的使用者)通常只需要知道如何将数据放入结构中,以及如何再次获取数据。您不关心数据结构的长度,只关注pushpop

如果您因任何原因需要获取容量(可能是有限的堆栈/队列?)那么最好从最终用户隐藏该详细信息并实现您自己的堆栈/队列结构。

答案 2 :(得分:1)

Stack<T>Queue<T>不会公开此信息。此信息甚至不会显式存储在这些类中,只能隐式地以内部数组的长度形式存储。

获得它的唯一选择是使用反射来访问数组并获得它的长度。