Skip to content

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