2011-01-07 17 views
0

說我有這個在我的課Stack對象如何與價值的物品

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

當我打電話_cursorRefCounts.Peek()得到什麼回來了?它是一個參考還是一個價值?

如果我增加返回的值然後再次調用Peek將會更大?

我似乎記得發生了什麼,當它被放入Stack對象時,int就被裝箱了。然後當它出來時它會被取消裝箱。拆箱是否再次使它成爲一個價值物品?

如果我想增加堆棧中的頂級項目,我該怎麼做? (注意:這是一個多線程應用程序,我想只增加頂部值而不彈出它(雖然我想我可以鎖定該部分))

+2

聽起來好像你已經爲作業選擇了錯誤的集合類。您不應該永遠需要修改堆棧中包含的值。 – 2011-01-07 16:47:52

+0

@Cody Gray - 爲什麼不呢?如果我創建了一個簡單的對象,其中包含一個名爲RefCount的int屬性,那麼我可以說`++ _ cursorRefCounts.Peek()。RefCount;` – Vaccano 2011-01-07 16:50:49

回答

10

Peek將返回一個值,因此遞增它不會修改堆棧上的值。

要增加頂部項目,將其彈出,增加並重新推回。

3

無論您定義爲您的通用類型Stack對象,它返回爲該類型。這是仿製藥的魔力。絕對沒有拳擊/拆箱,你只需得到一個int

由於int是一種值類型,因此您將其作爲值類型接收,而不是對該值的引用。

Peek()不會改變堆棧。它只是告訴你什麼是最重要的。要修改該值,請先Anna Lear says您需要Pop()

1

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

但即使它返回一個盒裝整數,或者如果堆棧持有可變引用類型,對它的任何操作都將是而非線程安全

您應該簡單地lock的事情:

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

理論上你應該甚至用輔助對象鎖定在但一般來說這是不行的。