2010-07-01 146 views
2

這是寫在鏈路http://msdn.microsoft.com/en-us/magazine/bb985010.aspx.NET垃圾收集器

「當應用程序創建一個新對象時,新的運營商分配從堆存儲器;如果該對象的類型包含Finalize方法,然後一個指針對象被放置在最終化隊列中。「

可有人請澄清我

1)這意味着,只有當我們明確地使用的finalize(使用析構函數),那麼物體會去完成隊列。 2)每個.NET類通過隱式使用finalize(使用析構函數),因此所有的.net類庫對象都會去完成隊列。

3)我們喜歡 自定義類什麼班組長一個 { } 類A OBJ會去完成與否,cosidering兩種情況下(顯性/隱性的析構函數)

4)如果上面的類寫在非託管代碼究竟會happen.It會去完成隊列或不

感謝

回答

3

1)是的,它實現最終確定()對象 - 在C#方法(「析構函數」)被添加的最終化-隊列。

2)不,大部分.NET類沒有Finalizer。如果在類中沒有實現該類,那麼該類的實例將不會添加到最終隊列中。

3)當A類實現爲Finalize-Method時,您只會進入最終隊列。 (C#中的「析構函數」#

4)未管理的類不受管理。這個不會被垃圾回收,也不會被添加到finalize隊列中。

一些一般說明。

  • C#中的'析構函數'不是C++意義上的析構函數。當它被稱爲等等時,你沒有受助者。它用於編寫終結器方法的語法糖。
  • 避免終結器,因爲它們會增加附加開銷。首先,對象必須添加到完成隊列中。然後它必須被垃圾收集兩次。第一次檢測到它不再被使用。第二次終結器方法結束時。
  • 使用IDisposable接口來管理和釋放資源。特別是原生資源。
  • 僅使用終結器,用於本機資源的「緊急清理」。基本上你檢查對象是否正確放置(IDisposable) - 連接。如果沒有,你在終結者中做這項工作,以防止進一步的資源泄漏。
+0

+1,非常重要的一點! – CharithJ 2011-09-30 06:23:10