13

容量属性在列表中是否比在堆栈和队列等其他集合中更有用?还是有另一种方法来获取堆栈或队列的容量?

4

3 回答 3

5

我认为ListCapacity属性和Stack没有属性的原因Queue是这些类型的正常用法不同。

对于 aList来说,用大量值填充它是相当普遍的,即使在它创建后的一段时间也是如此。提供Capacity属性(和构造函数参数)有助于减少在向列表中添加大量项目时将完成的重新分配次数。

StackQueue另一方面,在创建后不会立即将大量项目添加到其中

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

但是,请注意Queue 确实有一个允许您指定初始容量的构造函数, Stack也是如此

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

所以微软认为它在构建时会很有用,但后来就没有用了——所以他们只在构造函数中添加了容量功能。

(顺便说一句,我刚刚快速检查了我们的代码库,似乎我们唯一使用容量的List时间实际上是在构建时。所以也许如果微软现在正在设计 List,他们也可能会省略Capacity属性 for列表...)

于 2013-06-27T08:50:34.913 回答
3

StackQueue分别是 LIFO 和 FIFO 结构。

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

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

于 2013-06-27T08:39:04.867 回答
2

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

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

于 2013-06-27T08:39:33.900 回答