我为代码使用默认的IDisposable实现模板(模式)。
片段:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool isDisposing)
{
if (!this.disposed)
{
if (isDisposing)
{
//cleanup managed resources
}
//cleanup unmanaged resources
this.disposed = true;
}
}
我的问题:为什么在Dispose公共(public)方法中调用“GC.SuppressFinalize(this)”?处置托管资源后,将“GC.SuppressFinalize(this)”放置在 protected 方法的“if(isDispose)”部分中。
像这样:
protected virtual void Dispose(bool isDisposing)
{
if (!this.disposed)
{
if (isDisposing)
{
//cleanup managed resources
GC.SuppressFinalize(this);
}
//cleanup unmanaged resources
this.disposed = true;
}
}
最佳答案
我认为它是“模板设计”模式的明确案例。
您的抽象类经过精心设计,可以处理所有必需的重要/必要任务(在此处,GC.SuppressFinalize(this)),并允许派生类仅覆盖部分代码。
这里有2种情况:
片段1,SuppressFinalize,在Dispose中
片段2,SuppressFinalize,在Dispose中(true)
在这里,代码段1确保始终执行GC.SuppressFinalize。在代码段2中,保留了GC.SuppressFinalize的执行,但要靠派生类来代替。
因此,通过将GC.SuppressFinalize放入Dispose方法中,作为类的设计者,您将始终确保无论派生类编写的代码如何,都将执行GC.SuppressFinalize。
这只是在Dispose中编写SuppressFinalize而不是Dispose(true)的好处。