idisposable gc.suppressfinalize (이) 위치
-
03-07-2019 - |
문제
내 코드에 기본 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.