C#中的Dispose模式 有更新!
在C#中的每一个类型都可以看做是一种资源,这些资源可以分为两类:
- 托管资源:由CLR管理分配和释放的资源,即从CLR里new出来的对象。
- 非托管资源:不受CLR管理的对象,如Windows的窗口,文件句柄、数据库连接、套接字、COM对象等。
对于托管资源来说,由于受到CLR的管理,我们不需要关心资源释放的问题,完全可以依赖于垃圾回收器来进行内存的管理,但是对于非托管资源来说,由于其不受CLR管理,使用完毕后,就需要显式释放这些资源。
对于非托管资源,则应该执行以下操作:
-
实现Dispose模式
这要求你提供 IDisposable.Dispose 实现以启用非托管资源释放,当不再需要此对象(或其使用的资源)时,调用者可以通过调用Dispose方法释放非托管资源
-
调用者忘记调用Dispose方法的情况下,需要提供一种方法来释放非托管多资源
- 使用安全句柄包装非托管资源
- 重写 Object.Finalize 方法
本方将重点总结一下Dispose模式的实现方式及注意事项,同时会结合《编写高质量代码改善C#程序的157个建议》一书中的内容进行一下总结。