说我在班上有这个
private static Stack<int> _cursorRefCounts = new Stack<int>();
当我致电_cursorRefCounts.Peek()
时会回复什么?它是参考还是价值?
如果我增加返回的值然后再次调用Peek,那么会更大吗?
我似乎记得发生的事情是,当它被放入Stack对象时,int被装箱。然后当它出来时它被取消装箱。拆箱是否会再次成为价值物品?
如果我想增加堆栈中的顶级项目,我该怎么做? (注意:这是一个多线程的应用程序。我想只是递增顶部值而不将其弹出。(虽然我想我可以锁定该部分。)
答案 0 :(得分:10)
Peek
将返回一个值,因此递增它不会修改堆栈上的值。
要递增顶部项目,将其弹出,递增,然后再将其推回。
答案 1 :(得分:3)
无论您将哪种类型定义为Stack
对象的泛型类型,它都会以该类型返回。这是仿制药的神奇之处。绝对不会涉及装箱/拆箱,只需获得int
。
由于int
是值类型,因此您将其作为值类型接收,而不是对该值的引用。
Peek()
不会改变堆栈。它只是告诉你什么是最重要的。要修改该值,请Anna Lear says为Pop()
,首先需要{{1}}。
答案 2 :(得分:1)
如前所述,Peek<int>()
将返回一个值。
但是即使它返回一个盒装整数,或者如果Stack持有一个可变引用类型,对它的任何操作都将不是线程安全的。
你应该只是lock
这件事:
lock(_cursorRefCounts)
{
int v = _cursorRefCounts.Pop();
_cursorRefCounts.Push(v+1);
}
理论上你甚至应该使用一个辅助对象来锁定,但一般来说这样做。