〉根 对象托管堆 (~)终止化链表 终止化队列
〉GC对托管对象有很好的清理工作,但对象使用了非托管资源时,我们需要一些机制来帮助GC做好清理工作。
1:析构函数~ Finalize()完成器
。Object 保护方法Finalize() 可以被继承对象重写,一旦被重写(用~函数),GC就认为它是含完成器的对象。
。一个对象的~编译后成proteced override void Finalize(){try{...清理工作..}catch{base.Finalize()}}
[.net规定的机制 要保证调用了base.Finalize()父类的非托管清理 如果是多层继承,每层都用这个结构]
。 Finalize()方法由GC调用
。对重写了 Finalize() 的类 在“垃圾回收”回收 要经过终止化链表 终止化队列的操作后[因为它含清理代码] 第二次才被GC回收
。缺点:用该方式来清理非托管资源 时间上具有不确定性能,而且GC回收要经过两次
2:Dispose() :在程序中可调用显示清理
。 优点:可由程序员可控制
。public void Dispose()
{
// 清理代码 比如说释放非托管资源
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//如果对象有~ (Finalize())还要执行下列代码
System.GC.SuppressFinalize(this);//告诉GC不要执行调用指定对象的完成器了(Finalize),我已经处理了
}
。//使用uing 语句的对象必须实现了System.IDisposable
using (Class_Dispose cd=new Class_Dispose())
{
//使用cd的行为
//即时出现异常 uing 语句也会调用 cd的Dispose方法来清理非托管的代码
//其实uing的结构就是try{} finally{对象.Dispose();}
**出现异常,程序会跳出对象作用域,这样对象.Dispose()执行不了,但用try()catch()finally{}就是保证对象.Dispose()也能执行
}
。关于继承体系中各层含要清理的代码如何实现 Dispose(); protected virtual Dispose(bool)
个人觉得应该是这样 最低基类{ Dispose{this.Dispose(bool)}} 每层子类 Dispose(bool){....base.Dispose(bool)}
如:Component中Dispose()和proteced virtual Dispose(bool)--- Control中的Dispose(bool)---Form类中protected Dispose(bool)
?MyForm类重写protected Dispose(bool)在什么时候调用Dispose呢
?bool的值又是怎么决定的呢
3:Dispose()和Finalize双重保险机制
4: 最后是关于close()与Dispose()