的IDisposable
模式是一个对象,可以消耗及时免费非托管和托管资源的机制:如果你将它们包装成using
声明更容易。
模式实现的典型方法如下:
public void Dispose() //Implementes the IDisposable interface
{
this.Dispose(true);
GC.SupressFinalize(this); //All resources have been released, no need to run the finalizer. We make the GC's life a little easier;
}
protected void Dispose(bool disposing)
{
if (disposing)
{
//Relesase managed resources.
}
//Release unmanaged resources.
}
~MyDisposableObject() //finalizer
{
this.Dispose(false)
}
这里要注意的一点是,资源通过Dispose
方法释放是非常相似的,你在逻辑上希望在一个找一下终结者。它不是在终结直接完成主要有两个原因:
的终结不确定性的顺序执行。这就是为什么我们不处理来自终结器(Dispose(false)
)的管理资源,因为对象所持有的一些或所有受管资源可能已在对象本身之前完成。这对非托管资源来说并非如此,因为根据定义,它们将永远不会被GC
最终确定。
我们不知道当终结器运行(它是由GC
)。
的基本思路是,实施IDisposable
对象为任何消费者说一个牌子:“哎,我持有一定量的非托管和/或管理的资源最终将被释放时GC
决定我不再有用,但如果您及时需要这些资源,请拨打Dispose(),我会很乐意提供。“。
另一方面,将参考变量设置为null
根本不释放任何资源。 如果从对象中删除的引用是唯一指向该对象的引用,那么对象最终将被GC
收集,并且托管和非托管资源将被释放(何时,是否有人猜测)。
如果还有更多的实时引用仍然指向该对象,那么该对象将生活一个,并且任何资源都不会被释放。
检查我的答案,我错误地发布它作为评论:) –