微软建议的dispose 模式说 Dispose() 和 finalizer 都应该调用虚拟的第三个方法 Dispose(bool)。所以它看起来像这样:
public class DisposeBase : IDisposable
{
private bool _Disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~DisposeBase()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (!_Disposed)
{
if (disposing)
{
/* Get rid of managed resources */
}
/* Get rid of unmanaged resources */
_Disposed = true;
}
}
}
派生类将覆盖 Dispose(bool)。我想像这样重组它:
public abstract class ExtendableResourceHandlerBase : IDisposable
{
private bool _Disposed = false;
/* private resources managed and unmanaged */
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~DisposeBase()
{
Dispose(false);
}
private void Dispose(bool disposing)
{
if (!_Disposed)
{
if (disposing)
{
ManagedDispose();
// Dispose of own managed resources
}
UnmanagedDispose();
// Dispose of own unmanged resources
_Disposed = true;
}
}
protected abstract void ManagedDispose();
protected abstract void UnmanagedDispose();
protected abstract xxx ExtendMe(....)
// other member functionality
}
我正在考虑在框架中声明一个抽象基类的场景,该基类提供一个接口和一些实现获取需要处理的资源 - 因此是IDisposable
接口。现在扩展这个基类的客户将被迫考虑如何处置他们的托管和非托管资源。在微软建议的模式的情况下,人们可能会忘记它。请把这个名字想象ExtendableResourceHandlerBase
成一个占位符。
在我看来,这将使从 DisposeBase 派生的客户更容易实现他们的 dispose 方法。正如另一个问题的答案所示,其他人也这么认为。我能想到微软的好人为什么要像现在这样构建他们的模式的唯一原因是不分开对托管和非托管资源的处置。还有其他原因吗?非常感谢您启发我。