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

公众号:老翅寒暑
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了