Dispose模式 标签

C#中的Dispose模式 有更新!

  |   0 评论   |   0 浏览

在C#中的每一个类型都可以看做是一种资源,这些资源可以分为两类:

  • 托管资源:由CLR管理分配和释放的资源,即从CLR里new出来的对象。
  • 非托管资源:不受CLR管理的对象,如Windows的窗口,文件句柄、数据库连接、套接字、COM对象等。

对于托管资源来说,由于受到CLR的管理,我们不需要关心资源释放的问题,完全可以依赖于垃圾回收器来进行内存的管理,但是对于非托管资源来说,由于其不受CLR管理,使用完毕后,就需要显式释放这些资源。

对于非托管资源,则应该执行以下操作:

  • 实现Dispose模式

    这要求你提供 IDisposable.Dispose 实现以启用非托管资源释放,当不再需要此对象(或其使用的资源)时,调用者可以通过调用Dispose方法释放非托管资源

  • 调用者忘记调用Dispose方法的情况下,需要提供一种方法来释放非托管多资源

    • 使用安全句柄包装非托管资源
    • 重写 Object.Finalize 方法

本方将重点总结一下Dispose模式的实现方式及注意事项,同时会结合《编写高质量代码改善C#程序的157个建议》一书中的内容进行一下总结。