匯出 (0) 列印
全部展開
本文章是由人工翻譯。 將指標移到文章內的文字上方即可查看原文。
譯文
原文

Object.Finalize 方法

更新:2010 年 12 月

允許物件在記憶體回收進行回收之前,嘗試釋放資源並執行其他清除作業。

命名空間:  System
組件:  mscorlib (在 mscorlib.dll 中)

protected virtual void Finalize()

Finalize 方法用於在目前物件終結之前,對目前物件持有的 Unmanaged 資源執行清除作業。 這是受保護方法,因此只能透個這個類別或衍生類別存取。

在物件變成無法存取之後,會自動呼叫這個方法,除非物件已經透過 GC.SuppressFinalize 的呼叫,從最終處理中排除。 在應用程式定義域關閉期間,會自動在免於最終化的物件上呼叫 Finalize,即使那些物件仍然可以存取。 除非物件是使用如 GC.ReRegisterForFinalize 機制重新註冊,而且未接著呼叫 GC.SuppressFinalize,否則 Finalize 會在給定執行個體上自動呼叫一次。

衍生型別中的每個 Finalize 實作必須呼叫基底型別 的 Finalize 實作。 這是允許應用程式碼呼叫 Finalize 的唯一狀況。

注意事項注意事項

因為 C# 編譯器不允許您直接實作 Finalize 方法,C# 解構函式會自動呼叫其基底類別的解構函式。

Finalize 作業具有下列限制:

  • 完成項在記憶體回收期間執行的確切時間尚未定義。 不保證在任何指定時間都會釋放資源,除非呼叫 Close 方法或 Dispose 方法。

  • 不保證兩個物件的完成項會以任何特定的順序執行,即使其中一個物件參考另一個物件。 也就是說,如果物件 A 具有物件 B 的參考,並且兩者都具有完成項,則在物件 A 的完成項啟動時,物件 B 可能已經最終處理。

  • 未指定執行完成項的執行緒。

Finalize 方法可能無法執行至完成,或者在下列例外情況下可能完全無法執行:

  • 另一個完成項永遠阻斷 (進入無限迴圈,嘗試取得永遠無法取得的鎖定等等)。 因為執行階段嘗試執行完成項至完成,所以,如果某一完成項永遠阻斷,則可能不會呼叫其他完成項。

  • 處理序終止,未提供執行階段清除的機會。 在這個狀況下,執行階段的第一個處理序終止的告知為 DLL_PROCESS_DETACH 告知。

只有在可最終處理物件的數目持續減少時,執行階段才會在關閉期間持續至 Finalize 物件。

如果 FinalizeFinalize 的覆寫擲回例外狀況,且覆寫預設原則的應用程式不裝載 (Host) 執行階段,則執行階段會結束處理序,且不會執行任何使用中的 try-finally 區塊或完成項。 如果完成項無法釋放或終結資源,則這個行為會確保處理序的完整性。

實作者注意事項

依據預設,Object.Finalize 不會做任何動作。 它一定要在必要時由衍生類別覆寫,因為如果 Finalize 作業必須執行,則記憶體回收期間的回收可能需花費更長的時間。

如果 Object 保存任何資源的參考,則為了在記憶體回收期間卸除 Object 之前釋放這些資源,必須由衍生類別覆寫 Finalize

在重新宣告 Managed 物件 (使用 Unmanaged 資源) 時,在它使用所必須釋放的 Unmanaged 資源 (例如,檔案控制代碼或資料庫連接) 時,型別必須實作 Finalize 如需補充和更容易控制處置資源的方法,請參閱 IDisposable 介面。

Finalize 可以執行任何動作,包括在記憶體回收期間清除物件之後重新恢復物件 (也就是說,重新使物件變為可以存取)。 然而,物件只能重新恢復一次;在記憶體回收期間,無法在已重新恢復的物件上呼叫 Finalize

解構函式是 C# 執行清除作業的機制。 解構函式提供適當的保護,例如自動呼叫基底型別的解構函式。 在 C# 程式碼中,無法呼叫或覆寫 Object.Finalize

下列範例確認在覆寫 Finalize 的物件終結時會呼叫 Finalize 方法。 請注意,在生產應用程式中,Finalize 方法會被覆寫,以釋出此物件所持有的 Unmanaged 資源。 另外請注意,C# 範例提供的是解構函式,而不是覆寫 Finalize 方法。


using System;
using System.Diagnostics;

public class ExampleClass
{
   Stopwatch sw;

   public ExampleClass()
   {
      sw = Stopwatch.StartNew();
      Console.WriteLine("Instantiated object");
   } 

   public void ShowDuration()
   {
      Console.WriteLine("This instance of {0} has been in existence for {1}",
                        this, sw.Elapsed);
   }

   ~ExampleClass()
   {
      Console.WriteLine("Finalizing object");
      sw.Stop();
      Console.WriteLine("This instance of {0} has been in existence for {1}",
                        this, sw.Elapsed);
   }
}

public class Demo
{
   public static void Main()
   {
      ExampleClass ex = new ExampleClass();
      ex.ShowDuration();
   }
}
// The example displays output like the following:
//    Instantiated object
//    This instance of ExampleClass has been in existence for 00:00:00.0011060
//    Finalizing object
//    This instance of ExampleClass has been in existence for 00:00:00.0036294


.NET Framework

支援版本:4、3.5、3.0、2.0、1.1、1.0

.NET Framework Client Profile

支援版本:4、3.5 SP1

支援版本:

Windows 7, Windows Vista SP1 (含) 以後版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (不支援伺服器核心), Windows Server 2008 R2 (SP1 (含) 以後版本支援伺服器核心), Windows Server 2003 SP2

.NET Framework 並不支援各種平台的所有版本。如需支援的版本的清單,請參閱.NET Framework 系統需求

日期

記錄

原因

2010 年 12 月

加上 C# 解構函式會呼叫基底類別 Finalize 方法的註解,並加入範例。

客戶回函。

社群新增項目

新增
顯示:
© 2014 Microsoft