我的代码使用默认的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公共方法中调用"GC.SuppressFinalize(this)“?在释放托管资源之后,我会将"GC.SuppressFinalize(this)“放在protected方法的"if (isDisposing)”部分。
如下所示:
protected virtual void Dispose(bool isDisposing)
{
if (!this.disposed)
{
if (isDisposing)
{
//cleanup managed resources
GC.SuppressFinalize(this);
}
//cleanup unmanaged resources
this.disposed = true;
}
}发布于 2009-03-03 08:55:31
我想这是模板设计模式的一个明显的例子。
您的抽象类旨在处理所有需要的重要/必要任务(这里是GC.SuppressFinalize(this)),并允许派生类仅覆盖代码的一部分。
这里有两种情况:
Dispose中的代码段1,SuppressFinalize
Dispose中的代码段2,SuppressFinalize (True)
在这里,代码片段1确保始终执行GC.SuppressFinalize。而代码段2则将GC.SuppressFinalize的执行交由派生类处理。
因此,通过将GC.SuppressFinalize放在Dispose方法中,作为类的设计者,您将始终确保无论派生类编写什么代码,GC.SuppressFinalize都将被执行。
这是在Dispose而不是Dispose中编写SuppressFinalize的唯一好处(True)。
发布于 2009-03-03 10:56:05
Dispose(bool isDisposing)方法不属于IDisposable接口。
您通常会从Dispose方法调用Dispose(true),并从终结器调用Dispose(false),作为对象尚未释放的情况下的备用方法。
调用SuppressFinalize告诉GC不需要调用对象的终结器,大概是因为在调用Dispose时所有的清理工作都已经完成了。
如果您的类中没有终结器,那么您根本不需要调用SuppressFinalize,因为没有终结器需要抑制!
Joe Duffy有一些很棒的guidelines on disposal, finalization, garbage collection etc。
发布于 2009-03-03 08:04:10
我认为任何一种布局都可以选择,但可能他们想要在受保护的Dispose方法中强调“将所有释放代码放在这个方法中”,所以他们将另一个Dispose(抑制finalization)工件放在了其他地方。
另外,假设一个派生类有另一个调用受保护的Dispose方法的原因,但仍然希望终结化发生(不管是什么原因,我不知道)。
https://stackoverflow.com/questions/605466
复制相似问题