我根据类需要使用以下两种形式的 dispose:
方法 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 方法模式,并在 Dispose 方法的末尾调用 base.Dispose。
还要保护所有公共方法(至少使用已释放成员的方法),如果类实例已被释放,则使用抛出 ObjectDisposedException 的方法 /check。
即使您没有任何非托管资源,FxCop 也会始终要求您实现 Dispose 的 ClassHavingManagedAndUnManagedCode 形式。