官术网_书友最值得收藏!

3.2 類的函數

在實例化類時經常會用到函數,本節介紹類的兩種函數,即構造函數和析構函數。一般情況下,可以將構造函數稱為構造方法,析構函數稱為析構方法。

3.2.1 構造函數

任何時候,只要創建類或結構,就會調用它的構造函數。類或結構可能有多個接受不同參數的構造函數。構造函數使程序員可以設置默認值、限制實例化以及編寫靈活且便于閱讀的代碼。

構造函數的名稱與類名相同,能夠在構造函數中定義參數,但是不能有返回類型。每一個類中必須有一個構造函數,如果開發者沒有為對象提供一個構造函數,那么默認情況下C#會創建一個構造函數,該構造函數實例化對象,并且將成員變量設置為默認值表中列出的默認值。例如,在范例2中,通過new關鍵字實例化BookType類時,調用的就是無參構造函數。

【范例3】

通過手動方式聲明BookType類的無參構造函數,代碼如下。

     public class BookType
     {
         public BookType() {
             Console.WriteLine("這是無參的構造函數");
         }
         /* 省略其他代碼 */
     }

重新運行Program.cs文件,輸出結果如下。

    這是無參的構造函數
    這是無參的構造函數
    第一本圖書類型:校園小說
    第二本圖書類型:旅游雜志

從上述輸出結果可以看出,每次通過new BookType()實例化BookType類的對象時都是調用的無參構造函數,并且輸出“這是無參的構造函數”的提示信息。

除了聲明無參的構造函數外,還可以創建有參的構造函數,有參構造函數也很簡單,下面通過范例4說明。

【范例4】

在范例3中,BookType類包含一個無參構造函數、一個公有字段和一個公有方法。在前面代碼的基礎上添加新代碼,向BookType類添加一個有參的構造函數,在該函數中傳入一個string類型的typename參數,代碼如下。

    public BookType(string typename) {
        this.typeName = typename;
        Console.WriteLine("調用有參構造函數");
    }

向Program.cs文件的Main()方法中加入新代碼,直接通過BookType類的有參構造函數實例化對象,代碼如下。

    BookType booktype3 = new BookType("穿越小說");
    Console.WriteLine("第三本圖書類型:"+booktype3.TypeName);

從上述代碼中可以看出,通過有參的構造函數可以直接傳入一個圖書類型的名稱作為參數,而不必再通過“對象.字段名”進行賦值。重新運行Program.cs文件,輸出結果如下。

    這是無參的構造函數
    這是無參的構造函數
    第一本圖書類型:校園小說
    第二本圖書類型:旅游雜志
    調用有參構造函數
    第三本圖書類型:穿越小說

注意

如果為類聲明了一個有參的構造函數,那么必須顯式創建一個無參的構造函數。如果不創建無參的構造函數,那么在調用無參構造函數時會出現錯誤。

一個類可以有多個有參的構造函數,開發者可以根據需要進行創建。如在BookType類中,不僅可以包含表示圖書類型名稱的typeName字段,當然還可以包含圖書編號的typeId字段。在聲明有參構造函數時,函數中可以指定一個參數,也可以指定兩個或多個參數。

3.2.2 析構函數

析構函數用于析構類的實例,它與構造函數不同,當對象脫離其作用域時(如對象所在的方法已經調用完畢),系統會自動執行析構函數中的代碼。析構函數往往用來做清理垃圾碎片的工作。開發者在使用析構函數時,需要注意以下幾點。

(1)一個類只能有一個析構函數。

(2)析構函數無法被繼承。

(3)析構函數被編譯器調用,開發者無法控制何時調用,由垃圾回收器決定。

(4)析構函數沒有訪問修飾符和參數。

(5)析構函數不能定義返回值類型,也不能定義返回值。

(6)程序退出時自動調用析構函數。

聲明析構函數時,其函數名稱必須是類名,只要在命名前使用“~”符號與構造函數進行區別。語法如下:

    ~類名(){
        //銷毀實例語句
    }

析構函數只能存在于類中,不能存在于結構中,析構函數沒有任何的修飾符,不能被顯式調用,沒有參數,也就意味著析構函數不能有重載。

【范例5】

在本范例中創建三個類,這三個類構成一個繼承鏈,First類是父類,Second類是從First類派生而來的,而Third類是從Second類派生而來的,它們都有析構函數,代碼如下。

    class First
    {
        ~First()
        {
            Console.WriteLine("First's destructor is called.");
        }
    }
    class Second : First
    {
        ~Second()
        {
            Console.WriteLine("Second's destructor is called.");
        }
    }
    class Third : Second
    {
        public Third() {
            Console.WriteLine("hello,my dear");
        }
        ~Third()
        {
            Console.WriteLine("Third's destructor is called.");
        }
    }

在Program.cs文件的Main()方法中,創建Third類的實例,代碼如下。

    class Program
    {
       static void Main(string[] args) {
          Third t = new Third();
       }
    }

運行Program.cs文件查看輸出結果,內容如下。

    hello,my dear
    Third's destructor is called.
    Second's destructor is called
    First's destructor is called.
主站蜘蛛池模板: 依兰县| 安化县| 汾西县| 福建省| 辛集市| 望江县| 石阡县| 拉孜县| 常山县| 富民县| 枣强县| 乐陵市| 连平县| 阿坝县| 呼图壁县| 徐州市| 宁德市| 惠州市| 万年县| 嘉祥县| 祁阳县| 凌云县| 西畴县| 大渡口区| 桂阳县| 柳林县| 恭城| 威信县| 河池市| 巩义市| 饶阳县| 重庆市| 密山市| 兴仁县| 平顶山市| 福鼎市| 泾川县| 大姚县| 恭城| 宁化县| 清原|