2011-01-07 7 views
0

내가 무엇을 반환됩니다스택 객체가

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

내가 _cursorRefCounts.Peek() 전화를 내 수업이이 말 값 항목으로 작동하는 방법? 참조 또는 값입니까?

반환되는 값이 증가하면 Peek를 다시 호출하면 1이 커집니다.

나는 Stack 객체에 넣어지면 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

당신이 Stack 개체가 있으면 해당 형식으로 반환됩니다. 이것은 제네릭의 마법입니다. 절대 복싱/언 박싱은 관련이 없으며 단순히 int이됩니다.

int은 값 유형이므로 값 유형으로 수신하고 값에 대한 참조는 아닙니다.

Peek() 스택을 변경하지 않습니다. 그것은 단순히 위에 무엇이 있는지 알려줍니다. 값을 수정하려면 Anna Lear says으로 먼저 Pop()해야합니다.

1

이미 설명한 바와 같이 Peek<int>()은 값을 반환합니다.

비록 boxed 정수를 반환하거나 Stack이 가변 참조 유형을 보유하고 있어도 그 위의 모든 연산은 스레드 안전이 아닌 이됩니다.

당신은 단순히 lock 것은해야

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

은 이론적으로 당신도에 고정하는 도우미 개체를 사용해야하지만, 일반적으로이 할 것입니다.