容量属性在列表中是否比在堆栈和队列等其他集合中更有用?还是有另一种方法来获取堆栈或队列的容量?
3 回答
我认为List
有Capacity
属性和Stack
没有属性的原因Queue
是这些类型的正常用法不同。
对于 aList
来说,用大量值填充它是相当普遍的,即使在它创建后的一段时间也是如此。提供Capacity
属性(和构造函数参数)有助于减少在向列表中添加大量项目时将完成的重新分配次数。
Stack
Queue
另一方面,在创建后不会立即将大量项目添加到其中。
据推测,微软认为不值得添加该Capacity
属性,因为它不会被大量使用。
但是,请注意Queue 确实有一个允许您指定初始容量的构造函数, Stack也是如此。
另请注意,这两个类也有一个TrimExcess()
方法,如下面的@drch 所述。
所以微软认为它在构建时会很有用,但后来就没有用了——所以他们只在构造函数中添加了容量功能。
(顺便说一句,我刚刚快速检查了我们的代码库,似乎我们唯一使用容量的List
时间实际上是在构建时。所以也许如果微软现在正在设计 List,他们也可能会省略Capacity
属性 for列表...)
Stack
和Queue
分别是 LIFO 和 FIFO 结构。
在这两种情况下,您(作为 API 的使用者)通常只需要知道如何将数据放入结构中,以及如何再次取出数据。您不关心数据结构的长度,只关心push
and pop
。
如果您出于任何原因需要获取容量(可能是有界堆栈/队列?),那么最好对最终用户隐藏该细节并实现您自己的堆栈/队列结构。
Stack<T>
或不会公开此信息Queue<T>
。这些信息甚至没有显式存储在这些类中,只是以内部数组长度的形式隐式存储。
您唯一的选择是使用反射来访问数组并获取它的长度。