您的位置:首页 > 其它

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()的调用的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐