Finalize方法应该干什么?

看到蝈蝈谈到 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()的调用的方法。

posted on 2004-03-15 14:28  Meyer  阅读(2342)  评论(7编辑  收藏  举报

导航