淺談C#中建構函式與解構函式

來源:互聯網
上載者:User
 

建構函式和解構函式

本節說明對象的建立、初始化和銷毀過程。本節介紹下列主題:

l         類建構函式

l         結構建構函式

l         解構函式

 

類建構函式

本節將討論三種類建構函式:

類建構函式的類型

注釋

執行個體

用於建立並初始化類的執行個體。

私人

在類之外不可訪問的特殊類型執行個體建構函式。無法用私人建構函式來執行個體化類。

靜態

在建立第一個執行個體或引用任何靜態成員之前,將自動調用這種建構函式來初始化類。無法直接調用這種建構函式。

備忘

       (1) 執行個體建構函式

       建立新對象時將調用類建構函式,例如:

       Point myPoint = new Point();

       一個類可以有多個建構函式。例如,可以聲明一個不帶參數的建構函式(如 Point())和一個帶參數的建構函式(如 Point(int x, int y))。

       如果類沒有建構函式,將自動產生一個預設的無參數建構函式,並使用預設值初始化對象欄位(例如,int 將初始化為 0)。

       類建構函式可通過base關鍵字來調用基類的建構函式,例如:

       public Cylinder(double radius, double height): base(radius, height)

       {

       }

       類建構函式也可通過關鍵字 this 調用同一個類的另一個建構函式,例如:

       public Point(): this(0,20)

       {

       }

       在前面的樣本中,無參數建構函式 Point() 調用了另一個帶有兩個參數的建構函式,將預設位置初始化為 (0, 20)。

 

       (2)私人建構函式

       私人建構函式是一種特殊的執行個體建構函式。它通常用在只包含靜態成員的類中。如果類具有一個或多個私人建構函式而沒有公用建構函式,則不允許其他類(除了嵌套類)建立該類的執行個體。例如:

       class NLog

       {

            // Private Constructor:

            private NLog() {}  

            public static double e = 2.71828;

       }

       聲明空建構函式可阻止自動產生預設建構函式。注意,如果您不對建構函式使用存取修飾詞,則在預設情況下它仍為私人建構函式。但是,通常顯式地使用 private(私人)修飾符來清楚地表明該類不能被執行個體化。

 

       (3)靜態建構函式

       靜態建構函式用於初始化類。在建立第一個執行個體或引用任何靜態成員之前,將自動調用靜態建構函式來初始化類。

       靜態建構函式既沒有存取修飾詞,也沒有參數。

       在建立第一個執行個體或引用任何靜態成員之前(方法或欄位),將自動調用靜態建構函式來初始化類。

       無法直接調用靜態建構函式。靜態建構函式也不能訪問非靜態成員,它只被調用一次

       在程式中,使用者無法控制何時執行靜態建構函式。

       靜態建構函式的典型用途是:當類使用記錄檔時,將使用這種建構函式向記錄檔中寫入項。

 

結構建構函式

       結構建構函式類似於類建構函式,只是存在以下差異:

n         結構不能包含顯式的無參數建構函式。結構成員將自動初始化為它們的預設值。

n         結構不能有以下形式的初始值設定項:base (argument-list)。

       結構可以聲明建構函式,但它們必須帶參數。聲明結構的預設(無參數)建構函式是錯誤的。結構成員不能有初始值設定項。總是提供預設建構函式以將結構成員初始化為它們的預設值。

       對於結構,不像類那樣存在繼承。一個結構不能從另一個結構或類繼承。結構不能有以下形式的初始值設定項:base (argument-list)。

 

解構函式

       解構函式用於銷毀類的執行個體。

       備忘

              不能對結構使用解構函式。只能對類使用解構函式。

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

              無法繼承或重載解構函式。

              無法調用解構函式。它們是被自動調用的。

              解構函式既沒有修飾符,也沒有參數。例如,下面是類 MyClass 的解構函式的聲明:

                     ~ MyClass()

                     {

                          // Cleanup statements.

                     }

       該解構函式隱式地對對象的基類調用 Object.Finalize 方法。這樣,前面的解構函式代碼被隱式地轉換為:

              protected override void Finalize()

              {

                   try

                    {

                        // Cleanup statements.

                }

                   finally

                   {

                        base.Finalize();

                   }

              }

       這意味著對繼承鏈中的所有執行個體遞迴地(從派生相近程度最大的到派生相近程度最小的)調用 Finalize 方法。

       程式員無法控制何時調用解構函式,因為這由記憶體回收行程決定的。記憶體回收行程檢查是否存在應用程式不再使用的對象。它認為這些對象符合銷毀條件並回收這些對象佔用的記憶體。程式退出時也會調用解構函式。

 

base關鍵字

       base 關鍵字用於從衍生類別中訪問基類的成員:

       調用基類上已被其他方法重寫或隱藏的方法。

       指定建立衍生類別執行個體時應調用的基類建構函式。

       基類訪問只能在建構函式、執行個體方法或執行個體屬性訪問器中進行。

       靜態方法中使用 base 關鍵字是錯誤的。

This 關鍵字

       this 關鍵字表示類的當前執行個體。

       靜態成員沒有 this 指標。

       訪問被相同的名稱隱藏的成員。

       如:

              public Employee(string name, string alias)

              {

                   this.name = name;

                   this.alias = alias;

              }

       將this作為參數傳遞到其他方法。

       如:

       CalcTax(this);

       聲明索引器,例如:

       public int this [int param]

       {

      get

      {

         return array[param];

      }

      set

      {

         array[param] = value;

      }

   }

       調用同類中其它的建構函式

       靜態方法、靜態屬性訪問器引用 this 是錯誤的。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.