[C#] DataTable.Dispose()

這篇是承接上一篇DATATABLE MEMORY LEAK

由於同事質疑DataTable的Dispose實作是假的,沒有效果

所以我就針對這個議題研究了一下

主要參考來自以下兩篇文章:


 

一般Dispose會實作下列動作

  1. 判斷是否做過釋放動作
  2. 釋放托管資源
  3. 釋放非托管資源
  4. 取消解構子調用

而C#中釋放資源的Method有兩個

  • Finalize():GC在物件lifetime結束所使用,其中會call Dispose(false),釋放非托管資源,而托管資源則交由GC自動回收。
  • Dispose()使用者主動呼叫,call Dispose(true),釋放託管與非託管資源,並call GC.SuppressFinalize(this)告訴GC,已主動回收完成。

以上的架構,可以多找幾個Dispose的Case來看,就比較能有體會。


 

而我們查看.Net Framework的DataTable

可以知道DataTable是實作MarshalByValueComponent介面

而它的Dispose相關Method如下

public void Dispose() {
    Dispose(true);
    GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
     if (disposing) {
         lock(this) {
             if (site != null && site.Container != null) {
                 site.Container.Remove(this);
             }
             if (events != null) {
                 EventHandler handler = (EventHandler)events[EventDisposed];
                 if (handler != null) handler(this, EventArgs.Empty);
             }
         }
     }
}

附註:DataTable本身沒有任何的非託管資源

因此跟上一段的Dispose架構對照結果如下

  1. 判斷是否做過釋放動作:None
  2. 釋放托管資源:Dispose(true)
  3. 釋放非托管資源:Dispose(false)
  4. 取消解構子調用:GC.SuppressFinalize(this)

最後在Dispose(true)中的Container及Handler就是託管資源

可以在使用者call Dispose()時,透過disposing = true釋放

 

 

 

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s