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

C#—建構函式和解構函式

一、前言

       作為比C更先進的語言,C#提供了更好的機制來增強程式的安全性,C#編譯器具有嚴格的型別安全檢查功能,它幾乎能找出程式中所有的語法問題,但是程式通過了編譯檢查並不表示錯誤已經不存在了,不少難以察覺的程式錯誤是由於變數沒有被正確初始化或清除造成的,而初始化和清除工作很容易被人遺忘。微軟利用面向物件的概念在設計C#語言時充分考慮了這個問題並很好地予以解決:把物件的初始化工作放在建構函式中,把清除工作放在解構函式中。當物件被建立時,建構函式被自動執行。當物件消亡時,解構函式被自動執行。這樣就不用擔心忘記物件的初始化和清除工作。

二、建構函式

       建構函式又叫構造方法,它是一種特殊的成員函式,它主要用於為物件分配儲存空間,對資料成員進行初始化,也就是就是對類進行初始化。

       主要特點:

        1、建構函式的名字必須與類同名

        2、建構函式沒有返回型別,它可以帶引數,也可以不帶引數

        3、宣告類物件時,系統自動呼叫建構函式,建構函式不能被顯式呼叫

        4、建構函式可以過載,從而提供初始化類物件的不同方法

        5、若在宣告時未定義建構函式,系統會自動生成預設的建構函式,此時建構函式的函式體為空

       語法:

[訪問修飾符]  <類名>()
{
  //建構函式的主體
}

建構函式分為例項建構函式、私有建構函式和靜態建構函式

      (1、)例項建構函式

       例項建構函式是實現對類中例項進行初始化的方法成員。

class Program
    {
        public class cat
        {
            int i;
            public cat() //定義cat類的構造方法
            {
                i = 4;
                Console.WriteLine("The cat,{0} ", i);
            }
            static void Main(string[] args)
            {
                cat cat1 = new cat();
                Console.Read();
            }
        }
    }
       首先定義了一個私有成員i,經過初始化給它賦了一個初值4,當例項化類cat時,就會執行例項建構函式。

     (2、)私有建構函式

       私有建構函式是一種特殊的例項建構函式。它通常用在只包含靜態成員的類中。 如果類具有一個或多個私有建構函式而沒有公共建構函式,則其他類無法建立該類的例項。

class Program
    {
        public class dog
        {
            private dog()
            {
                Console.WriteLine("this is dog");
            }
        }
        public class cat
        {
            int i;
            private cat() //定義cat類的構造方法
            {
                i = 4;
                Console.WriteLine("The cat,{0}", i);
            }
            static void Main(string[] args)
            {
                dog dog1 = new dog();  //不可訪問,受保護級別限制而無法例項化
                cat cat1 = new cat();
                Console.Read();
            }
        }
    }
         這是舉了一個錯誤的例子,即使在dog類中新增一個靜態成員,依舊無法建立dog類的例項。
      (3、)靜態建構函式

       靜態建構函式是實現對一個類進行初始化的方法成員。它一般用於對靜態資料的初始化。靜態建構函式不能有引數,不能有修飾符而且不能被呼叫,當類被載入時,類的靜態建構函式自動被呼叫。

class Program
    {
        public class dog
        {
            static int i;
            static dog()
            {
                i = 1;
                Console.WriteLine("the dog 預設建構函式 i={0}",i );
            }
        }
        public class cat
        {
            static void Main(string[] args)
            {
                dog dog1 = new dog();
                Console.Read();
            }
        }
    }
       注意靜態建構函式只能對靜態資料成員進行初始化,而不能對非靜態資料成員進行初始化。但是,非靜態建構函式既可以對靜態資料成員賦值,也可以對非靜態資料成員進行初始化。

三、解構函式

解構函式是實現銷燬一個類的例項的方法成員。解構函式不能有引數,不能任何修飾符而且不能被呼叫。由於解構函式的目的與建構函式的相反,就加字首‘~’以示區別。

        雖然C#(更確切的說是CLR)提供了一種新的記憶體管理機制——自動記憶體管理機制,資源的釋放是可以通過“垃圾回收器” 自動完成的,一般不需要使用者干預,但在有些特殊情況下還是需要用到解構函式的,如在C#中非託管資源的釋放。

        語法:

public class ResourceHolder 
        {
            ......
            ~ResourceHolder()
            {
                // 這裡是清理非託管資源的使用者程式碼段
            }
        }
        建構函式與解構函式雖然是一個類中形式上較簡單的函式,但它們的使用決非看上去那麼簡單,因此靈活而正確的使用建構函式與解構函式能夠更好的管理系統中的資源。繼續加油!!