我看到 common guideline在 C# 中实现一次性模式是要有一个抽象基类,它实现 IDisposable 接口(interface)的 Dispose() 方法并提供 protected 虚拟 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。无需处理 bool 值。
我发现 this article提出了类似的技术。但就是这样!没有其他人提到它。这种方法有缺陷吗?
最佳答案
这种方法最大的缺陷是它占用了有限的资源……从一个类派生的能力意味着如果我使用你的实现,我基本上可以和 OOP 说再见了,因为我需要从中派生出很多类你的类,并且不能像我实现接口(interface)时那样从另一个类派生它们。
所以在现实世界中,您会混合使用您的基类的一些类,一些类出于业务目的滚动他们自己的基类,这些基类已经包含 IDisposable
和一些只是实现接口(interface)。我不能代表所有人,但我宁愿使用一种工具(例如 R#)将相同结构应用到所有类,而不是混合使用各种东西。
如果我们有能力从多个基类派生,这可能是一回事,但我们在 C# 中没有。
关于c# - 在 C# 中使用 IDisposable 的模板方法模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46976647/