2013年11月11日 星期一

GC.SuppressFinalize 的用法

GC.SuppressFinalize ,通常使用在自己實作的 Dispose 使用之後,但我不太懂為什麼還要再使用 GC.SuppressFinalize ?

Dispose(true);
GC.SuppressFinalize(this);

後來我在網路上找到一段很有趣的解釋:

dispose告诉这个实体:哥不要你了,你可以去死了。
GC.SuppressFinalize(true); 这就是告诉系统,看到死尸了,让他去清理一下

其實光是 GC.SuppressFinalize(true) 就已經是個錯誤,正確用法是 GC.SuppressFinalize(this)

在 MSDN 上的解釋為「 要求系統不要為指定物件呼叫完成項 」,備註為「

這個方法會在物件標頭中設定位元,當系統呼叫完成項時會檢查這個位元。 obj 參數必須是這個方法的呼叫端。 如果 obj 沒有完成項,呼叫 SuppressFinalize 方法沒有作用。

實作 IDisposable 介面的物件會從 IDisposable.Dispose 方法呼叫這個方法,以免記憶體回收行程在不需要 Object.Finalize 的物件上呼叫它。



最後附上正確解釋,以下引用來自 [C#]Effective C# 條款十八:實現標準Dispose模式 的解釋:

具有解構子的物件其在被垃圾收集器回收處理時,會先被放入解構佇列之中,再交由另一個專門處理解構動作的執行緒去做解構的動作,當解構的動作完成,該物件又會被放回原來的佇列等待垃圾收集器的回收,因此其性能上的耗費會比沒有解構子的物件還來的多。由於IDisposable在實作上會習慣加入解構子做為保險措施,防止類別的使用者忘記叫用Dispose方法,造成資源的洩漏。故在釋放完資源後,我們應該隨即在後呼叫GC.SuppressFinalize,告知垃圾收集器該物件的解構動作跳過不處理。

沒有留言 :

張貼留言

Related Posts Plugin for WordPress, Blogger...