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

posted on   老翅寒暑  阅读(2532)  评论(8编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了

导航

< 2005年5月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 1 2 3 4
5 6 7 8 9 10 11
点击右上角即可分享
微信分享提示