为什么要使用Stack <T>而不是List <T>?

Bil*_*eal 11 .net c# collections

List<T>来自System.Collections.Generic所有事情Stack<T>,以及更多 - 它们基于相同的基础数据结构.在什么条件下选择是否正确Stack<T>

Abe*_*ler 13

如果您需要Last In First Out项目集合,则可以使用堆栈.列表将允许您在任何索引处访问它的项目.还有很多其他的差异但我会说这是最根本的.

评论后更新:

我会说using使用Stack<T>了一个关于如何使用这个代码的声明.计划未来总是好的,但如果你现在有需要Stack<T>,没有令人信服的理由使用List<T>那么我会去Stack<T>

  • 我会说使用`Stack <T>`会说明你希望如何使用这段代码.计划未来总是好的,但是如果你现在需要`Stack <T>`,并且没有令人信服的理由使用`List <T>`那么我会选择`Stack <T>` (4认同)
  • @JeremyTodd然后当下一个开发人员出现并且不知道你的`List`列表在逻辑上是`Stack`并尝试添加/删除/读取除了结尾之外的其他地方时会发生什么?此外,如果您在逻辑上表示堆栈,则以后不需要随机访问,这就是重点.这种情况并不罕见; `Stack`是一个有用的逻辑数据结构. (2认同)
  • @JeremyTodd,它会使代码更复杂.可以为`List`实现对`Stack.Pop()`的调用,但它不会那么干净.对于稍后遇到该代码的人来说,这看起来有点奇怪. (2认同)

Ser*_*rvy 5

Stack好吧,如果您在逻辑上尝试表示堆栈,您可能会想要使用。如果您使用堆栈,它将在整个代码中传达程序员的意图,并且它将防止无意中误用数据结构(无意中添加/删除/读取一端以外的其他位置)。

当然有可能,它不是一个具体的实现,Stack而是一个接口。然后您可以List实现该接口之类的东西。那里的问题主要是便利性问题。如果有人需要一个堆栈,他们需要选择一些特定的实现并记住(“哦,是的,List 是首选的堆栈实现”),而不是仅仅更新具体类型。


dim*_*414 5

为什么我会人为地限制自己在新代码中使用Stack

有您的答案- Stack当您需要强制执行合同期望所使用的数据结构只能作为堆栈进行操作时,应使用该答案。当然,您真正想做的时间是有限的,但是在适当的时候它是一个重要的工具。

例如,假设要处理的数据没有任何意义,除非执行了堆栈顺序。在这些情况下,如果您将数据作为列表提供,则可能会遇到麻烦。通过使用Stack(或Queue,或任何其他顺序敏感的结构),您可以在代码中精确指定应该如何使用数据。

  • “假设底层数据结构无法有效地作为列表使用”,整个帖子的重点是,情况永远不会如此。 (2认同)