1. 程式人生 > >C#解構函式

C#解構函式

  • 不能在結構中定義解構函式。只能對類使用解構函式。

  • 一個類只能有一個解構函式。

  • 無法繼承或過載解構函式。

  • 無法呼叫解構函式。它們是被自動呼叫的。

  • 解構函式既沒有修飾符,也沒有引數。

例如,下面是類 Car 的解構函式的宣告:

    class Car
    {
        public int CarID { get; set; }
        ~Car()
        {
            //在解構函式中,可以執行釋放其他託管資源處理
            Console.WriteLine($"當前Car物件被釋放,CarID={CarID}");
        }
    }

該解構函式隱式地對物件的基類呼叫 Finalize。這樣,前面的解構函式程式碼被隱式地轉換為:

protected override void Finalize()
{
    try
    {
        // cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}

這意味著對繼承鏈中的所有例項遞迴地呼叫 Finalize 方法(從派生程度最大的到派生程度最小的)。

Note注意

不應使用空解構函式。如果類包含解構函式,Finalize 佇列中則會建立一個項。呼叫解構函式時,將呼叫垃圾回收器來處理該佇列。如果解構函式為空,則只會導致不必要的效能丟失。

程式設計師無法控制何時呼叫解構函式,因為這是由垃圾回收器決定的。垃圾回收器檢查是否存在應用程式不再使用的物件。如果垃圾回收器認為某個物件符合析構,則呼叫解構函式(如果有)並回收用來儲存此物件的記憶體。程式退出時也會呼叫解構函式。

可以通過呼叫 Collect 強制進行垃圾回收,但大多數情況下應避免這樣做,因為這樣會導致效能問題。有關更多資訊,請參見強制垃圾回收