クラスのニーズに基づいて、次の 2 つの形式の破棄を使用します。
方法 1 (マネージド リソースとアンマネージド リソース、または派生クラスを含むクラスの場合):
class ClassHavingManagedAndUnManagedCode : IDiposable
{
private volatile bool _disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
//Do managed disposing here.
}
//Do unmanaged disposing here.
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
_disposed = true;
}
~ClassHavingManagedAndUnManagedCode()
{
Dispose(false);
}
}
方法 2 (管理対象リソースのみのクラス / 封印クラス / 子クラスを持たないクラスの場合):
class ClassHavingOnlyManagedCode : IDiposable
{
private volatile bool _disposed = false;
public void Dispose()
{
if (!_disposed)
{
//Dispose managed objects.
_disposed = true;
}
}
}
ClassHavingManagedAndUnManagedCode の子クラスはすべて、保護された破棄メソッド パターンに従い、Dispose メソッドの最後で base.Dispose を呼び出す必要があります。
また、クラス インスタンスが既に破棄されている場合は、ObjectDisposedException をスローするメソッド /check を使用して、すべてのパブリック メソッド (少なくとも破棄されたメンバーを使用しているメソッド) を保護します。
アンマネージ リソースがない場合でも、FxCop は常に ClassHavingManagedAndUnManagedCode 形式の Dispose を実装するように求めます。