표준 Dispose 패턴
public class MyResourceHog :IDisposable
{
//이미dispose되었는지의 여부를 저장하기 위한 플래그
private bool _alreadyDisposed = false;
//finalizer
//virtual Dispose 메서드를 호출한다.
~MyResourceHog()
{
Dispose(false);
}
//IDisposable Interface의 구현
//virtual Dispose메서드를 호출하고
//Finalization이 수행되지 않도록한다.
public void Dispose()
{
Dispose(true);
GC.SupressFinalize(true);
}
//virtual Dispose 메서드
protected virtual void Dispose(bool isDisposing)
{
//여려번 dispose를 수행하지 않도록 한다.
if (_alreadyDisposed)
return;
if (isDisposing)
{
//해야할 일: managed 리소스를 해제한다.
}
//해야할 일:unmanaged 리소스를 해제한다.
//dispose 플래그를 설정한다.
_alreadyDispose = true;
}
}
public class DerivedResourceHog : MyResourceHog
{
private bool _disposed = false;
protected override void Dispose(bool isDisposing)
{
//여러번dispose를 수행하지 않도록 한다.
if(_disposde)
return;
if(isDisposing)
{
//해야할일: managed 리소스를 해제한다.
}
// 해야할일: unmanaged 리소스를 해제한다.
//기반 class가 자신의 리소스를 해제할 수 있도록 한다.
//기반 class는
//GC.SuppressFinalize()를 호출할 책임이 있다.
base.Dispose(isDisposing);
//하위class의 dispose 플래그를 설정한다.
_dispose = true;
}
}
[출처] 표준 Dispose 패턴|작성자 joose2