2011-12-21 6 views
0

Dispose 메서드에서 GC.SupressFinalizer()를 호출 할 때마다 은 모든 인스턴스 멤버를 null로 지정해야 모든 인스턴스 멤버를 정리할 수 있고 어떤 경우이든 제거됩니다. ? 예를 들어IDisposable 패턴 : GC.SupressFinalizer

:

class test : IDisposable 
{ 
    public int a = 10; 
    public int b = 20; 
    public int c = 39; 

    private bool is_disposed = false; 

    Dispose(bool shall_dispose) 
    { 
     if(!is_disposed && shall_dispose) 
     { 
      is_disposed = true; 

      // shall I annulate a, b & c or they will be freed anyway?? 
      // a = null; ?, integers aint nullable 
      // b = null; ? 
      // c = null; ? 

      // or primitive types should't be annulated? only reference(heap) types? 
     } 
    } 

    Dispose() 
    { 
     Dispose(true); 
    } 

    ~test() 
    { 
     Dispose(false); 
    } 
} 

답변

2

GC.SupressFinalizer()는 더 이상 도달 할 때 수집되는 개체를 멈추지 않을 것이다, 그것은 단지 개체의 종료 자에 대한 호출을 supress 것입니다. 그래서 당신의 객체와 그 멤버 모두가 수집됩니다.

+0

감사합니다. 즉, GC가 실행되어 내 객체를 정리하지만 소멸자 호출은 발생하지 않습니다. 권리 ? – Alex

+0

정확히 무엇을 의미합니까? –

1

IDisposable.Dispose의 목적은 더 이상 필요하지 않다는 것을 개체에 알리는 것이며 다른 개체에 더 이상 필요하지 않음을 사용자에게 알려 주어야합니다 (예 : 파일 열기, 부여 독점적 인 메모리 블록 접근 등) 대부분의 경우, 객체가 Dispose 된 직후, 그 객체에 대한 참조는 포기되고, 객체는 가비지 컬렉션의 대상이되고, 다른 객체에 대한 보유 참조는 가비지 수집을 지연시키지 않습니다. 그럼에도 불구하고 다른 참조를 지우는 것이 좋습니다. Dispose가 호출 된 후에도 오랫동안 객체에 참조가 남아있을 가능성이 있습니다. 또한 IDisposable 개체가 가비지 수집기에서 2 세대에 도달하기에 충분히 길었을 수도 있습니다. 즉, 가비지 수집기가 다시이를 보게 될 수도 있습니다. 좀 더 최근에 생성 된 객체에 대한 참조를 보유하고 있으면 참조를 null로 설정하면 객체를 다른 객체보다 빨리 수집 할 수 있습니다.