2011-01-07 9 views
0

は、私が何を返されるStackオブジェクトが

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

私は_cursorRefCounts.Peek()を呼ぶ私のクラスでこれを持って言う価値項目でどのように動作?それは参照か値ですか?

返された値をインクリメントすると、もう一度Peekを呼び出すと、1が大きくなりますか?

私は、スタックオブジェクトに入れられると、intがボックス化されるということを思い出しているようです。その後、それが出てくると、それはunboxed取得します。アンボクシングはそれをもう一度価値項目にしますか?

スタックの一番上のアイテムを増やしたい場合、どうすればいいですか? (注:これはマルチスレッドのアプリケーションです。私はそれをポップすることなく上位の値をインクリメントしたいと思います(そのセクションをロックすることができると思いますが))

+2

あなたが間違ったコレクションクラスを選択したようです。スタック内の値を変更する必要はありません。 –

+0

@Cody Grey - なぜですか? RefCountというintプロパティを持つ単純なオブジェクトを作成すると、 '++ _ cursorRefCounts.Peek()。RefCount;' – Vaccano

答えて

10

Peekは値を返すので、増分してもスタックの値は変更されません。

先頭の項目をインクリメントするには、その項目をポップアップしてインクリメントしてから、もう一度押します。

+0

と言うことができます。悲しいことに、トップアイテムをポップすると別のスレッドが来て同じことをします物事、私はちょうどトップアイテムを増やす方法を見つけた場合とは異なる結果を得ることができます。私はその内部のintを更新できるように、トップアイテムをオブジェクトにしなければならないかもしれません。 – Vaccano

+4

マルチスレッド環境では、ロックを使用して増分操作をアトミックにする必要があります。 –

+0

スタックを 'public int RefCount {get;}を含む単純なオブジェクトを保持させることができませんでした。セット; } 'プロパティを呼び出し、' ++ _ cursorRefCounts.Peek()。RefCount; '?スレッドセーフでもないでしょうか? – Vaccano

3

genericタイプとして定義しているものはStackオブジェクトであれば、その型として返されます。これはジェネリック医薬品の魔法です。絶対にボクシング/アンボクシングは関係なく、あなたは単にintを取得します。

intは値型であるため、値の型として値を受け取ります。値への参照ではありません。

Peek()スタックを変更しません。それは単に何が上にあるのかを伝えます。値を変更するには、Anna Lear saysのように最初にPop()する必要があります。

1

すでに述べたように、Peek<int>()は値を返します。

しかし、ボックス化された整数を返した場合でも、Stackが可変参照型を保持していても、その上の操作はでスレッドセーフではありませんです。

は、あなたは、単にlock事が必要です。

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

は、理論的にはあなたもロックオンするヘルパーオブジェクトを使用する必要がありますが、一般的にはこれが行います。