Finalize方法应该干什么?
2004-03-15 14:28
369 查看
看到蝈蝈谈到 msdn 中关于链接关闭的一些警告???
谈到Finalize方法,对unmanaged资源的态度。Finalize方法中应该只释放自己直接控制的unmanagedr资源,而不应该去调用对象引用的Connection之类的Close或者Dispose方法来释放这些对象的unmanaged资源.这些资源的释放应该由各自的直接领导(即刚才提到的Connection之类)负责。
C#伪码解释。
class Foo
{
SqlConnection conn;
ManagedResource src;
~Foo()
{
conn.Close();//错误,不应该在这里调用conn的Close方法来
//释放conn的unmanagedr资源.
src = null;//这也大可不必了。
}
}
class SqlConnection
{
//Connection的unmanaged资源,应该通过他自己的Finalize方法来释放.
~SqlConnection()
{
Dispose(false);
}
}
因为,走到Finalize这一步,object已经是直差咽气了,他通过字段引用的其他对象也排到了Finalize的释放队列上。GC对Finalize方法的调用是无序的,很可能在你调用 你的类引用的Connection的对象的Close方法之前,他自己的Finalize方法已经执行了,即他应经先咽气了。这个Close的调用就变得很玄乎了。
上面的代码中,Foo不应该对他持有的SqlConnection即这里的conn调用Close方法。conn的非托管资源应该由他自己的Finalize释放。就是说没有义务在~Foo()中作conn.Close()操作。
同样在Finalize方法中对,managed资源设置空引用也是多余的事情。但在Dispose或者Close方法中这又是个积极的做法。
当然,Finalize方法的实际执行,我们是希望不要发生的.只将它作为释放unmanaged资源的最后一条防线,对于实现了IDisposable接口的class我们应该积极的通过using()语法来使用,或者其它能确保Dispose()的调用的方法。
谈到Finalize方法,对unmanaged资源的态度。Finalize方法中应该只释放自己直接控制的unmanagedr资源,而不应该去调用对象引用的Connection之类的Close或者Dispose方法来释放这些对象的unmanaged资源.这些资源的释放应该由各自的直接领导(即刚才提到的Connection之类)负责。
C#伪码解释。
class Foo
{
SqlConnection conn;
ManagedResource src;
~Foo()
{
conn.Close();//错误,不应该在这里调用conn的Close方法来
//释放conn的unmanagedr资源.
src = null;//这也大可不必了。
}
}
class SqlConnection
{
//Connection的unmanaged资源,应该通过他自己的Finalize方法来释放.
~SqlConnection()
{
Dispose(false);
}
}
因为,走到Finalize这一步,object已经是直差咽气了,他通过字段引用的其他对象也排到了Finalize的释放队列上。GC对Finalize方法的调用是无序的,很可能在你调用 你的类引用的Connection的对象的Close方法之前,他自己的Finalize方法已经执行了,即他应经先咽气了。这个Close的调用就变得很玄乎了。
上面的代码中,Foo不应该对他持有的SqlConnection即这里的conn调用Close方法。conn的非托管资源应该由他自己的Finalize释放。就是说没有义务在~Foo()中作conn.Close()操作。
同样在Finalize方法中对,managed资源设置空引用也是多余的事情。但在Dispose或者Close方法中这又是个积极的做法。
当然,Finalize方法的实际执行,我们是希望不要发生的.只将它作为释放unmanaged资源的最后一条防线,对于实现了IDisposable接口的class我们应该积极的通过using()语法来使用,或者其它能确保Dispose()的调用的方法。
相关文章推荐
- 唐人街探案纸竖起来是什么意思,而他们使用了对折手法,应该是错的,正确的方法应该插入缝中.
- Java牛角尖【005】:finalize方法什么时间执行?
- 第五节:什么导致Finalize方法被调用
- 重写Java 的equals和hashcode方法的时候应该注意什么
- 应该是什么在预新手发“外链”(4)最终的外链的方法
- Android关于 手机返回键和代码finish()方法退出activity他们有什么区别;当activity使用共享动画时应该调用哪个方法,结束activity
- finalize()方法是用来做什么的?
- Android开发经验—不要指望类finalize干活的方法做你想要什么
- 教师管理团队应该采用什么开发方法?
- finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
- 一开始实现的时候,不知道贝塞尔曲线,自己去思考其他方法实现了。怎么想到用到贝塞尔曲线?以后碰到类似问题,应该先在网上找找都有什么方法实现。
- 简述原型链是什么,有什么用处?若想访问一个对象的原型,应该使用什么方法?
- 要实现多线程同步处理,应该用什么关键字修饰方法。
- 什么是线程池,如何设计一个动态大小的线程池,应该有哪些方法?
- 普元 ESB 6.6,在开发的中介流中需要使用queryByNamedSql方法,这个方法对应的namedSql文件应该放在什么位置下?
- 如果重写了service方法应该添加什么代码来保证你的doGet或doPost方法能正常执行
- 学习.NET应该知道什么
- 赛式方法论(下):前期制作阶段究竟应该「做」些什么?
- GDB中应该知道的几个调试方法
- Junit中Assert.assertEquals()和Assert.assertSame方法有什么异同