Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不';t堆栈<;T>;和队列<;T>;列表时具有容量属性<;T>;做_C#_List_Stack_Queue_Capacity - Fatal编程技术网

C# 为什么不';t堆栈<;T>;和队列<;T>;列表时具有容量属性<;T>;做

C# 为什么不';t堆栈<;T>;和队列<;T>;列表时具有容量属性<;T>;做,c#,list,stack,queue,capacity,C#,List,Stack,Queue,Capacity,容量属性在列表中是否比在堆栈和队列等其他集合中更有用?或者有其他方法可以获得堆栈或队列的容量吗?堆栈和队列分别是后进先出和先进先出结构 在这两种情况下,您(作为API的使用者)通常只需要知道如何将数据放入结构中,以及如何再次取出数据。您不关心数据结构的长度,只关心push和pop 如果出于任何原因(可能是有界堆栈/队列?)需要获得容量,那么最好对最终用户隐藏该细节,并实现自己的堆栈/队列结构。此信息不会被堆栈或队列公开。这些信息甚至并没有显式存储在这些类中,只是以内部数组长度的形式隐式存储 获取

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

堆栈和
队列分别是后进先出和先进先出结构

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


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

此信息不会被
堆栈
队列
公开。这些信息甚至并没有显式存储在这些类中,只是以内部数组长度的形式隐式存储


获取该属性的唯一选项是使用反射来访问数组并获取其长度。

我认为
列表
具有
容量
属性,而
堆栈
队列
不具有此属性的原因在于这些类型的正常用法不同

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


另一方面,
Stack
Queue
在创建项目后往往不会立即添加大量项目

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

但是,请注意,以及

还要注意,这两个类都有一个方法,如下面@drch所述

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


(顺便说一句,我刚刚快速检查了我们的代码库,似乎我们唯一一次使用
List
的容量实际上是在构建时。因此,如果微软现在正在设计List,他们可能也会忽略List的
capacity
属性…)

队列和堆栈都有类似于容量的计数属性,但不知道为什么它们没有包含容量属性@杰米亨纳利:计数和容量是不一样的
Count
是存储在结构中的项目数量<代码>容量
是内部阵列可以存储的项目数量<代码>容量
从不小于
计数
。通常,它大于
计数
。如果它等于
Count
并且您想添加另一项,则内部数组将被复制到容量更大的新数组中。但是堆栈和队列都具有
Count
属性。。。
Capacity
属性的存在仅用于优化目的(这可能也适用于堆栈和队列以及列表)。这是一个奇怪的属性。堆栈和队列通常都是使用链表实现的(在链表中,容量没有帮助),但这是一个实现细节泄漏的示例。如果定义了
Capacity
,这将为底层实现提供一个重要线索,那么这可能就是问题所在。您可以使用正确的构造函数设置列表和队列的初始容量。参数名甚至是
capacity
List
是一种具体的类型,它暗示了底层实现(“表示可通过索引访问的对象的强类型列表”),因此,具有容量似乎很好<另一方面,code>LinkedList并没有提供这样的构造函数。事实上,关键是
Stack
Queue
确实允许您指定容量。还有TrimOverse()可以在内部数组未满90%时将容量设置为当前计数。