IDisposable模式实现起来成本很高。在实际处理资源之前,我已经数了17行代码。
最近Eric Lippert写了一篇博客文章提出了一个有趣的观点:任何时候Finalizer执行都是一个bug。我认为这很有道理。如果始终遵循IDisposable模式,Finalizer应该总是被抑制,它永远没有机会运行。如果我们认为Finalizer执行是一种错误,那么是否有必要制定指南强制开发人员从以下抽象类派生并禁止直接实现IDisposable接口呢?
public abstract class AbstractDisaposableBase: IDisposable
{
~AbstractDisaposableBase()
{
ReportObjectLeak();
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected abstract void Dispose(bool disposing);
[Conditional("DEBUG")]
private void ReportObjectLeak()
{
//Debug.Assert(false, "leaked instance");
//throw new Exception("leaked instance");
}
}
以下是翻译的结果:
好处很明显:
- 实现处理变得易于操作且无误,如下所示:
class MyClass1 : DisablableBase
{
protected override void Dispose(bool disposing)
{
//如果disposing==true,则释放托管和非托管资源
}
}
没有被处理的对象会被报告
始终遵循可处理模式
但是,这样的指南是否存在问题呢?
一个可能的问题是所有可处理的对象都将定义终结器。但由于终结器总是被压制的,因此不应该有任何性能损失。
您有什么想法?