1.前言
对.NET/C#稍有了解的同学,都应该知道IDispose模式的存在,但不知道有多少同学能彻彻底底地理解这种模式。楼主本人初识IDispose模式也有很长时间了,但对其设计原理和初衷也一直是云里雾里。直到这两天终于下定决心想彻底理解其工作模式,上网翻阅了不少资料,才算有所领悟,特别是StackOverFlow上的这篇文章:https://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface/538238#538238,让我有茅舍顿开之感,极力推荐各位英文不错的同学参看此文。
2.你是否也有这些疑问:
什么情况下需要实现IDisposeable接口?
IDisposable模式与垃圾收集器(GC)之间到底有什么关联?
isDisposing标志什么时候应该置为true,什么时候应该置为false,各自的意义是什么?
如果你也有如上疑问,希望看完本文,能给你一个满意的答复。
3. 托管资源和非托管资源
我们知道,在.NET平台下,代码中的资源类型包含两种:托管资源和非托管资源。你在.NET平台下创建的对象,以及你从FCL类库中调用的类型,一般都属于托管资源。只有windows窗体句柄、数据库连接以及网络连接(Socket)之类,以及你利用P/Invoke调用的Windows API属于非托管资源。
4. 非托管资源释放
如果你在一个(C#)类中创建了一个非托管资源,那么垃圾回收器将无法对其进行自动回收,这时候,程序员需要负责完成对该非托管资源的清理工作。作为类设计者,有多种方式可完成该项清理工作,比较常用的方法是,提供一个形如Clear()之类的清理接口函数,供类使用者调用,类设计者负