C#析構函數


一,什么是析構函數?

 在msdn中的解析:析構函數用於析構類的實例。

         class A                         // 基類First
        {
            ~A()                        // 析構函數
            {
                Console.WriteLine("~A()析構函數");
            }
        }    

特性:

1》不能在結構中定義析構函數。 只能對類使用析構函數。

2》一個類只能有一個析構函數。

3》無法繼承或重載析構函數。

4》無法調用析構函數。 它們是被自動調用的。

5》析構函數既沒有修飾符,也沒有參數。

二,使用析構函數的有什么用?

一,程序員無法控制何時調用析構函數,因為這是由垃圾回收器決定的。 垃圾回收器檢查是否存在應用程序不再使用的對象。 如果垃圾回收器認為某個對象符合析構,則調用析構函數(如果有)並回收用來存儲此對象的內存。 程序退出時也會調用析構函數。

二,使用析構函數釋放資源
通常,與運行時不進行垃圾回收的開發語言相比,C# 無需太多的內存管理。 這是因為 .NET Framework 垃圾回收器會隱式地管理對象的內存分配和釋放。 但是,當應用程序封裝窗口、文件和網絡連接這類非托管資源時,應當使用析構函數釋放這些資源。 當對象符合析構時,垃圾回收器將運行對象的 Finalize 方法

三,那析構函數和構造函數有什么區別?先上代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace XigouMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            C c = new C();             // 創建類的實例
        }

        class A                         // 基類First
        {
            ~A()                        // 析構函數
            {
                Console.WriteLine("~A()析構函數");
            }
            public A()
            {                            // 構造函數
                Console.WriteLine("A()構造函數");
            }
        }
        class B : A                     // B類從A類派生
        {
            ~B()                        // 析構函數
            {
                Console.WriteLine("~B()析構函數");
            }
            public B()                   // 構造函數
            {
                Console.WriteLine("B()構造函數");
            }
        }
        class C : B                     // C類從B類派生
        {
            ~C()                        // 析構函數
            {
                Console.WriteLine("~C()析構函數");
            }
            public C()                  // 構造函數
            {
                Console.WriteLine("C()構造函數");
            }
        }
    }
}

結果:

 

四,總結:

1》程序運行時,這三個類的析構函數將自動被調用,調用順序是按照從派生程度最大的(~C())到派生程度最小的(~A())次序調用的,和構造函數的調用順序正好相反。則可以得出,當用戶創建類的對象是調用構造函數,而當該對象已經調用完畢時,使用析構函數

2》析構函數(destructor) 與構造函數相反,當對象脫離其作用域時(例如對象所在的函數已調用完畢),系統自動執行析構函數。

3》析構函數往往用來做“清理善后” 的工作(例如在建立對象時用new開辟了一片內存空間,應在退出前在析構函數中用delete釋放)。
4》析構函數名也應與類名相同,只是在函數名前面加一個波浪符~,例如~A( ),以區別於構造函數。它不能帶任何參數,也沒有返回值(包括void類型)。只能有一個析構函數,不能重載。

4》如果用戶沒有編寫析構函數,編譯系統會自動生成一個缺省的析構函數,它也不進行任何操作。所以許多簡單的類中沒有用顯式的析構函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM