2010-02-24 3 views
2

대부분이 호기심을위한 것입니다.이 구성 (C ​​# 및 정기적으로 사용하는 다른 언어로)에서 생각할 수있는 거의 모든 유스 케이스를 구현하는 더 좋은 방법이 있지만, 최근에 여기에서 보았습니다. scoped mutex 멋진 개념이었다.사용 블록은 GC에 대한 참조를 만들고 유지 관리합니까?

제 질문은 사용중인 문이 참조를 유지합니까 (예 : GC가 실행되는 것을 방지 할 것인가)하는 것입니다. 내가 있다면

예를 들어,해야 할 일 :

using (new ScopedMutex()) 
{ 
// ... 
} 

는 ScopedMutex 객체는 사용 블록의 끝 부분에 자신의 존재를 유지하는 것, 또는 GC 실행 및 중간 블록 폐기 수 있을까?

답변

6

아니요, GC는 처리하지 않습니다. 해당 개체에 대한 참조는 로컬 변수 (see this answer for more info)에 저장됩니다. 로컬 변수는 GC 루트로 간주되며 객체는 그 객체에서 도달 할 수 있습니다 (using 블록이 Dispose을 호출 할 수 있어야합니다).

+0

아, 나는 물론이에 대한 참조를 필요로 지금 바보 같은 느낌이 결국 부르겠습니다 ... 고마워요. :) – Tanzelax

+0

문제의 객체가 봉인 된 클래스이고 아무것도하지 않는 'Dispose'메소드가있는 경우 JIT가 "Dispose"를 무효로 인라인하지 못하도록하는 사양이 있습니까? 'GC.KeepAlive'를 인라이닝하는 것은 금지됩니까? – supercat

+0

@supercat 나는 그것을 의심한다. GC에는 'Dispose'가 또 다른 방법입니다. 반면 'Finalize'(C#에서 소멸자로 나타남)는 GC가 특별히 신경을 쓰는 것이며 명시 적 소멸자가없는 객체에 대한 최적화 기능을 가지고 있습니다. –

0

중간 블록으로 처리하지 않습니다.

2

C# 컴파일러는 암시 적으로 변수를 만듭니다. using 문은 실제로 같은로 변환 될 컴파일 할 때 (당신이 BTW, 자신에 대한 정확한 코드를 볼 수 Redgate Reflector을 사용할 수 있습니다) 다음

ScopedMutex scopedMutex1 = new ScopedMutex(); 
try 
{ 
    // ... 
} 
finally 
{ 
    scopedMutex1.Dispose(); 
} 
관련 문제