Как объект Stack работает с элементами Value - PullRequest
0 голосов
/ 07 января 2011

Скажите, у меня есть это в моем классе

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

когда я звоню _cursorRefCounts.Peek() что возвращается? Это ссылка или значение?

Если я увеличу возвращаемое значение, то снова вызову Peek, будет ли на единицу больше?

Кажется, я вспоминаю, что когда он помещается в объект Stack, int упаковывается. Затем, когда он выходит, он распаковывается. Делает ли распаковка значение элемента снова?

Если я хочу увеличить верхний элемент в стеке, как бы я это сделал? (Примечание: это многопоточное приложение. Я хотел бы просто увеличить верхнее значение, не выталкивая его. (Хотя, думаю, я мог бы заблокировать этот раздел)

Ответы [ 3 ]

10 голосов
/ 07 января 2011

Peek вернет значение, поэтому его приращение не изменит значение в стеке.

Чтобы увеличить верхний элемент, уберите его, увеличьте и снова включите.

3 голосов
/ 07 января 2011

Какой бы тип вы не указали в качестве универсального типа для объекта Stack, он возвращается как этот тип.Это магия дженериков.Абсолютно никакой блокировки / распаковки не требуется, вы просто получаете int.

Поскольку int является типом значения, вы получаете его как тип значения, а не ссылку на значение.

Peek() не изменяет стек.Это просто говорит вам, что на вершине.Чтобы изменить значение, как Анна Лир говорит , вам нужно Pop() сначала.

1 голос
/ 07 января 2011

Как уже говорилось, Peek<int>() вернет значение.

Но даже если он вернул целое в штучной упаковке или если в стеке был изменяемый ссылочный тип, любая операция с ним была бы не поточнобезопасной .

следует просто lock вещь:

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

Теоретически вы должны даже использовать вспомогательный объект для блокировки, но в целом это будет делать.

...