Stack对象如何与Value项一起使用

时间:2011-01-07 16:38:05

标签: c# .net-3.5 stack

说我在班上有这个

private static Stack<int> _cursorRefCounts = new Stack<int>();

当我致电_cursorRefCounts.Peek()时会回复什么?它是参考还是价值?

如果我增加返回的值然后再次调用Peek,那么会更大吗?

我似乎记得发生的事情是,当它被放入Stack对象时,int被装箱。然后当它出来时它被取消装箱。拆箱是否会再次成为价值物品?

如果我想增加堆栈中的顶级项目,我该怎么做? (注意:这是一个多线程的应用程序。我想只是递增顶部值而不将其弹出。(虽然我想我可以锁定该部分。)

3 个答案:

答案 0 :(得分:10)

Peek将返回一个值,因此递增它不会修改堆栈上的值。

要递增顶部项目,将其弹出,递增,然后再将其推回。

答案 1 :(得分:3)

无论您将哪种类型定义为Stack对象的泛型类型,它都会以该类型返回。这是仿制药的神奇之处。绝对不会涉及装箱/拆箱,只需获得int

由于int是值类型,因此您将其作为值类型接收,而不是对该值的引用。

Peek()不会改变堆栈。它只是告诉你什么是最重要的。要修改该值,请Anna Lear saysPop(),首先需要{{1}}。

答案 2 :(得分:1)

如前所述,Peek<int>()将返回一个值。

但是即使它返回一个盒装整数,或者如果Stack持有一个可变引用类型,对它的任何操作都将不是线程安全的

你应该只是lock这件事:

lock(_cursorRefCounts)
{
    int v = _cursorRefCounts.Pop();
    _cursorRefCounts.Push(v+1);
}

理论上你甚至应该使用一个辅助对象来锁定,但一般来说这样做。