我为我的代码使用默认的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)"?在处理受管资源后,我会在受保护方法的"if(isDisposing)"部分中放置"GC.SuppressFinalize(this)".
像这样:
protected virtual void Dispose(bool isDisposing) { if (!this.disposed) { if (isDisposing) { //cleanup managed resources GC.SuppressFinalize(this); } //cleanup unmanaged resources this.disposed = true; } }
NileshChauha.. 12
我想它是模板设计模式的一个明显案例.
您的抽象类旨在处理所需的所有重要/必要任务(此处为GC.SuppressFinalize(this)),并允许派生类仅覆盖代码的某些部分.
这里有2个案例:
Snippet 1,SuppressFinalize,Dispose
Snippet 2,SuppressFinalize,Dispose(true)
在这里,Snippet 1确保始终执行GC.SuppressFinalize.在代码片段2中,由于派生类的支配而离开执行GC.SuppressFinalize .
因此,通过在Dispose方法中放置GC.SuppressFinalize,您作为类的设计者将始终确保无论派生类编写的代码是什么,都将执行GC.SuppressFinalize.
这只是在Dispose中编写SuppressFinalize而不是Dispose(true)的好处.
我想它是模板设计模式的一个明显案例.
您的抽象类旨在处理所需的所有重要/必要任务(此处为GC.SuppressFinalize(this)),并允许派生类仅覆盖代码的某些部分.
这里有2个案例:
Snippet 1,SuppressFinalize,Dispose
Snippet 2,SuppressFinalize,Dispose(true)
在这里,Snippet 1确保始终执行GC.SuppressFinalize.在代码片段2中,由于派生类的支配而离开执行GC.SuppressFinalize .
因此,通过在Dispose方法中放置GC.SuppressFinalize,您作为类的设计者将始终确保无论派生类编写的代码是什么,都将执行GC.SuppressFinalize.
这只是在Dispose中编写SuppressFinalize而不是Dispose(true)的好处.
该Dispose(bool isDisposing)
方法不是IDisposable
界面的一部分.
您通常会Dispose(true)
从您的Dispose
方法调用,并Dispose(false)
从终结器调用,作为对象尚未处理的情况下的后备.
调用SuppressFinalize
告诉GC,不需要调用对象的终结器,大概是因为所有清理都在Dispose
调用时完成.
如果你的班级没有终结者,那么你根本不需要打电话SuppressFinalize
,因为没有终结者可以压制!
Joe Duffy 在处理,定型,垃圾收集等方面有一些很好的指导.