Dispose()
は自動的に呼び出されません。 ファイナライザがある場合は、が自動的に呼び出されます。 IDisposable
を実装すると、ガベージコレクタを待機するのではなく、クラスのユーザーが早期にリソースを解放できるようになります。
クライアントには、例外があってもDispose()
の自動呼び出しを処理するusing
ステートメントを使用することをお勧めします。 IDisposable
の
適切な実装は次のとおりです。
class MyClass : IDisposable
{
private bool disposed = false;
void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(!disposed)
{
if(disposing)
{
// Manual release of managed resources.
}
// Release unmanaged resources.
disposed = true;
}
}
~MyClass() { Dispose(false); }
}
クラスのユーザーがDispose()
を呼び出す場合、クリーンアップは直接行われます。オブジェクトがガベージコレクタによってキャッチされている場合は、Dispose(false)
を呼び出してクリーンアップを実行します。ファイナライザ(~MyClass
メソッド)から呼び出された場合、管理参照は無効になる可能性があるため、アンマネージリソースのみを解放することができます。