补充ZendyHu对Finalize和IDispose异同的说明
ZendyHu 在他的文章 对.Net 垃圾回收的C#编程相关方面(Finalize 和Dispose(bool disposing)和 Dispose())的一些理解体会 中说了一下他对于.net垃圾回收的一些理解,不过个人认为他并没有说的很明白,所以补充说明一下。
道理其实很简单,因为Finalize是系统调用的,调用之前已经把该对象中多有的托管资源放到了垃圾回收队列中,所以Finalize中不需要重复释放托管资源,而只需要释放非托管资源。
而Dispose是 IDisposable 的成员函数,.net 的垃圾回收机制中并不认识这个接口,这个接口是为程序员们准备的。当我们主动调用Dispose的时候,对象并没有放到垃圾回收队列中,所以需要同时也处理对象中所有的托管资源。
当然,你不使用 Dispose(bool disposing) 也可以,因为它从根本上来说只是为了减少冗余而让Finalize和Dispose共用的函数后端代码而已。你如果把代码修改成不用Dispose(bool)也是完全正确的:
[代码1]
~Class()
{
ClearUnManagedResource();
}
void Dispose()
{
ClearManagedResource();
ClearUnManagedResource();
}
而把代码1修改成使用 Dispose(bool) 的话,就是如下:
[代码2]
~Class()
{
Dispose(false);
}
void Dispose()
{
Dispose(true);
}
void Dispose(bool disposing)
{
if( disposing )
ClearManagedResource();
ClearUnManagedResource();
}
我看,代码2这种方法还不如代码1来得容易看,而且因为一个Dispose的名字引出来这么多的问题,耗费大家这么多的时间,真是罪孽阿。
公众号:老翅寒暑