OK、IDisposable に関するベスト プラクティスについていくつか読んだことがありますが、基本的に (ようやく) アイデアが浮かびました。
私の質問は、IDisposable 基本クラスからの継承に関するものです。私が見るすべての例は、サブクラスで同じコードブロックを何度も書いていますが、利点がわかりません。
仮想メソッドを基本クラスに単純に焼き付けて、(プライベートに実装された) IDisposable ルーチン内から適切なタイミングで呼び出して、サブクラスが混乱しないようにするだけでなく、リソースを管理する機会を得ることもできません。 ?
私の提案した基本クラス:
public abstract class DreamDisposableBase : IDisposable
{
private bool _disposed = false;
protected virtual void LocalDispose(bool disposing)
{
}
~DreamDisposableBase()
{
// finalizer being called implies two things:
// 1. our dispose wasn't called (because we suppress it therein)
// 2. we don't need to worry about managed resources; they're also subject to finalization
// so....we need to call dispose with false, meaning dispose but only worry about *unmanaged* resources:
dispose(false);
}
void IDisposable.Dispose()
{
dispose(true); // true argument really just means that we're invoking it explicitly
}
private void dispose(bool disposing)
{
if (!_disposed)
{
// give sub-classes their chance to release their resources synchronously
LocalDispose(disposing);
if (disposing)
{
// true path is our cue to release our private heap variables...
}
// do stuff outside of the conditional path which *always* needs to be done - release unmanaged resources
// tell .net framework we're done, don't bother with our finalizer -
GC.SuppressFinalize(this);
// don't come back through here
_disposed = true;
}
}
}