现在的位置: 首页 > 综合 > 正文

补充ZendyHu对Finalize和IDispose异同的说明

2012年08月24日 ⁄ 综合 ⁄ 共 818字 ⁄ 字号 评论关闭

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的名字引出来这么多的问题,耗费大家这么多的时间,真是罪孽阿。

抱歉!评论已关闭.