문제

내 코드에 기본 idisposable 구현 템플릿 (패턴)을 사용합니다.

단편:

public void Dispose()
{
    Dispose(true);

    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool isDisposing)
{
    if (!this.disposed)
    {
        if (isDisposing)
        {
            //cleanup managed resources
        }

        //cleanup unmanaged resources

        this.disposed = true;
    }
}

내 질문 : 왜 "GC.Suppressfinalize (this)"라는 호출이 공개 방법에 처한 이유는 무엇입니까? 관리 자원을 처분 한 후 보호 된 방법의 "if (isdisposing)"섹션에 "gc.suppressfinalize (this)"를 배치 할 것입니다.

이와 같이:

protected virtual void Dispose(bool isDisposing)
{
    if (!this.disposed)
    {
       if (isDisposing)
       {
           //cleanup managed resources

           GC.SuppressFinalize(this);
       }

       //cleanup unmanaged resources

       this.disposed = true;
    }
}
도움이 되었습니까?

해결책

나는 그것의 명확한 템플릿 디자인 패턴의 사례라고 생각합니다.

초록 클래스는 필요한 모든 중요한/필요한 작업 (여기서는 GC.SuppressFinalize (this))를 처리하고 파생 클래스가 코드의 일부만 무시할 수 있도록 설계되었습니다.

여기에는 두 가지가 있습니다.
스 니펫 1, 억제, 처분
스 니펫 2, 억제, 처분 (true)

여기서 Snippet 1은 GC.Suppressfinalize가 항상 실행되는지 확인합니다. Snippet 2 인 동안 GC. Suppressfinalize의 실행을 자비로 남겨 둡니다. 파생 수업.

따라서 GC.Suppressfinalize를 배치함으로써 Dispose Method를 배치함으로써 귀하의 클래스의 디자이너는 항상 파생 된 클래스에서 작성한 코드에 관계없이 GC.Suppressfinalize가 실행되도록합니다.

이것은 처분하는 것보다 처분하는 (true)에서 억압제를 쓰는 것의 이점 일뿐입니다 (true).

다른 팁

그만큼 Dispose(bool isDisposing) 방법의 일부가 아닙니다 IDisposable 상호 작용.

당신은 일반적으로 전화합니다 Dispose(true) 당신의 Dispose 방법 및 호출 Dispose(false) 결승전에서, 객체가 아직 폐기되지 않은 경우의 폴백으로.

부름 SuppressFinalize GC에 객체의 최종화기를 호출 할 필요가 없다고 말합니다. Dispose 부름 받았다.

수업에 최종화기가 없다면 전화 할 필요가 없습니다. SuppressFinalize 전혀, 최종화자가 없기 때문에!

Joe Duffy는 위대합니다 폐기, 마무리, 쓰레기 수집 등에 대한 지침.

둘 다 레이아웃이 선택되었을 수 있다고 생각하지만 아마도 보호 된 처분 방법에 "이 방법에 모든 거래 코드를 넣는 것"을 강조하고 싶었 기 때문에 다른 곳에 다른 처분 (최종 조정 억제)을 두었습니다.

또한 파생 된 클래스가 보호 된 처분 방법을 호출 할 또 다른 이유가 있었지만 여전히 결승이 발생하기를 원한다고 가정합니다 (상상 된 이유에 대해서는 알 수 없습니다).

원인 .Dispose는 관리 코드 (귀하의 코드)가 객체를 처분하여 최종화를 거부 할 때입니다. 사람들은 일반적으로 파이널 라이저를 통해 처분 (bool 처분)으로 다른 경로를 만듭니다. 결승에 진출하는 사람은 전화가 의미가 없을 것입니다.

아이디어는 정리 코드를 한 번만 호출해야한다는 것입니다. 그러나 두 가지 입력 지점이 있습니다 Dispose 메소드 및 객체 최종화기. 언제 Dispose 정리 코드가 한 번만 호출되도록 최종화를 거부합니다. 그만큼 여기에 코드 더 잘 설명 할 수 있습니다.

인용하다:

// NOTE: Leave out the finalizer altogether if this class doesn't 
// own unmanaged resources itself, but leave the other methods
// exactly as they are. 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top