IDisposable
IDisposable的价值不在于“手动管理内存”,而在于为垃圾回收器看不见的资源定义一个明确的释放边界;实际使用时,优先把释放动作交给using。
原文链接¶
我的结论¶
IDisposable主要解决的是非托管资源释放问题,而不是替代 GC。- 文件句柄、流、窗口句柄这类资源不受垃圾回收器直接感知,释放时机不能只靠 GC。
- 在调用侧,
using/using var是最稳妥的写法,因为它把资源释放和作用域绑定在了一起。
关键信息¶
- 官方文档先给出
IDisposable的核心目标:释放非托管资源。 - 垃圾回收器并不知道窗口句柄、打开的文件、流这一类外部资源的生命周期。
- 这也是
Dispose模式存在的原因:托管对象可以等 GC,外部资源通常应该尽早归还。
摘录¶
to release unmanaged resources.
Furthermore, the garbage collector has no knowledge of unmanaged resources such as window handles, or open files and streams.
using
我的补充¶
- 判断一个类型是否需要实现
IDisposable,关键不是“它占不占内存”,而是“它有没有持有需要尽快释放的外部资源”。 - 如果一个类型内部持有
Stream、数据库连接或句柄包装对象,那么它通常也需要把释放责任暴露出来。 - 写业务代码时,与其在多个出口手动调用
Dispose(),不如尽量缩小作用域并直接使用using。
ref¶
- 来源:WuCai highlights