Finalize方法應該幹什嗎?

來源:互聯網
上載者:User

看到蟈蟈談到 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資源設定Null 參考也是多餘的事情。但在Dispose或者Close方法中這又是個積極的做法。

當然,Finalize方法的實際執行,我們是希望不要發生的.只將它作為釋放unmanaged資源的最後一條防線,對於實現了IDisposable介面的class我們應該積極的通過using()文法來使用,或者其它能確保Dispose()的調用的方法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.