容量属性在List中比在Stack和Queue等其他集合中更有用吗?或者是否有其他方法可以获得堆栈或队列的容量?
答案 0 :(得分:5)
我认为List
具有Capacity
属性且Stack
和Queue
的原因不是这些类型的正常用法不同。
对于List
,使用大量值填充它是相当常见的,甚至在创建它之后的一段时间。提供Capacity
属性(和构造函数参数)有助于减少在向列表中添加大量项目时要执行的重新分配的数量。
Stack
和Queue
不会在创建后立即添加大量项目。
据推测,微软认为不值得添加Capacity
属性,因为它不会被广泛使用。
但请注意Queue does have a constructor that allows you to specify an initial capacity和so does Stack。
另请注意,这两个类也有TrimExcess()
方法,如下面的@drch所述。
因此微软认为它在构建时很有用,但以后没用 - 所以他们只向构造函数添加了容量功能。
(顺便提一下,我刚刚通过我们的代码库进行了快速检查,似乎我们唯一一次使用List
的容量实际上是在构建时。所以也许微软现在正在设计List ,他们也可能省略List的Capacity
属性...)
答案 1 :(得分:3)
Stack
和Queue
分别是LIFO和FIFO结构。
在这两种情况下,您(作为API的使用者)通常只需要知道如何将数据放入结构中,以及如何再次获取数据。您不关心数据结构的长度,只关注push
和pop
。
如果您因任何原因需要获取容量(可能是有限的堆栈/队列?)那么最好从最终用户隐藏该详细信息并实现您自己的堆栈/队列结构。
答案 2 :(得分:1)
Stack<T>
或Queue<T>
不会公开此信息。此信息甚至不会显式存储在这些类中,只能隐式地以内部数组的长度形式存储。
获得它的唯一选择是使用反射来访问数组并获得它的长度。