2013-07-07 2 views
4

using 블록이 "사용 된"IDisposable 개체가 블록의 끝에 배치되도록합니다. 그러나 은 그 개체가 그 전에 처리되지 않을 것이라고 보증합니까?사용 블록은 블록이 끝날 때까지 개체가 처리되지 않도록 보장합니까?

using (new DisposableObject()) { 
    // blah blah 
} 

내가 DisposableObject는 블록이 끝날 때까지 배치되지 않는다는 것을 확신 할 수 있습니다, 또는 가비지 컬렉터 나는 그것을 더 핸들이없는 것을 감지 할 수 있습니다 내가 가지고있는 경우 즉

, 블록 안에 넣고 즉시 버리시겠습니까?

답변

4

개체는 한 번만 처리되며 사용 블록이 끝나기 전에 GC되지 않습니다.

{ 
    ResourceType resource = expression; 
    try { 
     statement; 
    } 
    finally { 
     if (resource != null) ((IDisposable)resource).Dispose(); 
    } 
} 

Dispose는 블록의 끝에서 한 번만 호출됩니다

사양은 다음이로 확장이 using (expression) statement을 가지고 표현의 유형이 nullable 형식 인 경우 (그 ResourceType 전화) 보장 일회용 개체에 대한 참조를 유지하는 로컬 생성 된 개체가 있습니다. 로컬은 using 블록이 끝나기 전에 객체가 GC되고 있지 않도록합니다.

+0

+1 그게 가장 명확한 설명이고, 답 신용에 합당합니다. 고맙습니다! –

6

아니요. 바로이 경우에 무슨 일이 일어날 지

using(var myObject = new DisposableObject()) 
{ 
    myObject.Dispose(); 
} 

DisposableObject의 의미에 따라 달라집니다 일에서 당신을 중지 아무것도 없다. 예외가 발생하거나 Dispose이 두 번 호출되면서 완전히 만족할 수도 있습니다.

개체 처리 및 가비지 수집은 완전히 다른 개념이라는 점에 유의해야합니다. 객체가 삭제되었다고해서 그것이 가비지 수집 될 것이라는 것을 의미하는 것은 아니며 객체가 가비지 수집되었다고해서 그것이 폐기 될 것이라는 것을 의미하지는 않습니다.

개체에 대한 모든 참조가 삭제되거나 도달 할 수 없으면 개체가 가비지 수집 될 수 있습니다. 블록 자체가 객체에 대한 참조를 가지고 있기 때문에 코드가 using 블록 내부에서 실행되는 동안에는 이러한 일이 발생하지 않습니다.

+0

질문의 요점을 놓친 것 같습니다. 문제는 GC가 사용 블록이 끝나기 전에 GC가 최종자를 호출하는지 여부입니다. – CodesInChaos

+0

+1 가비지 수집과 객체 처리를 구별 해 주셔서 감사합니다. 이전에는 마음 속에 분명하지 않았습니다. 그래서 내 질문을 바꿔서 : 내 질문에 코드에서,'DisposableObject'에 의존 할 수 * 폐기 * 전에'using' 블록의 끝? –

+0

@Shaul 아니요 변수 myObject가 using 블록의 끝에서 삭제되지 않도록 보장 할 방법이 없습니다.개체에 대한 모든 참조가 도달 할 수 없으면 개체가 삭제 될 수 있지만 사용중인 블록에서는 해당 개체에 대한 참조가 있으므로 해당 개체가 표시되지 않습니다. –

2

처분보다는 가비지 수집에 대해 알고 싶다고 생각합니다.

가비지 수집기는 using 블록 내부에서 개체를 수집하지 않습니다. Dispose 메서드를 특별히 호출하더라도 여전히 활성 참조가 있으므로 수집되지 않습니다.

using 블록에 대해 생성 된 코드는 개체가 처리 될 수 있는지 검사하여 끝나기 때문에 using 블록에서 개체가 활성 상태로 유지됩니다.

관련 문제