【发布时间】:2018-04-09 03:41:48
【问题描述】:
我看到 common guideline 在 C# 中实现一次性模式是有一个抽象基类,它从 IDisposable 接口实现 Dispose() 方法并提供一个受保护的虚拟 Disposable(bool) 方法。然后子类需要覆盖 Disposable(bool) 并始终执行以下操作:
if (!disposed && disposing)
{
// dispose resources here
disposed = true;
}
我的问题是:不能重用这种模式吗?我不喜欢在每个子类中管理这种“处置状态”。我们可以有一些像这样的抽象基类:
public abstract class AbstractResource : IDisposable
{
private bool myDisposed = false;
protected abstract void ReleaseUnmanagedResources();
protected virtual void ReleaseManagedResources()
{
// optionally override this to explicitly call Dispose() of other IDisposable objects
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!myDisposed)
{
if (disposing)
{
ReleaseManagedResources();
}
ReleaseUnmanagedResources();
myDisposed = true;
}
}
~AbstractResource()
{
Dispose(false);
}
}
那么这个类的用户只需要实现ReleaseUnmanagedResources和(可选)ReleaseManagedResources。无需处理布尔值。
我发现this article 提出了类似的技术。但就是这样!没有其他人提到它。这种方法有缺陷吗?
【问题讨论】:
-
是的,这是完全有效的。这里的重点是;您真正需要使用终结器来实现完整的
IDisposable模式的时候,实际上从来没有。仅当您需要处理原始资源时才需要这样做,并且其中大多数已经在框架中的某处实现了IDisposable包装器,因此您一开始就不需要这样做。 -
您的抽象类是否处理非托管资源?
标签: c# .net design-patterns dry idisposable