C#—構造函數和析構函數


   一、前言

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

       二、構造函數

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

       主要特點:

        1、構造函數的名字必須與類同名

        2、構造函數沒有返回類型,它可以帶參數,也可以不帶參數

        3、聲明類對象時,系統自動調用構造函數,構造函數不能被顯式調用

        4、構造函數可以重載,從而提供初始化類對象的不同方法

        5、若在聲明時未定義構造函數,系統會自動生成默認的構造函數,此時構造函數的函數體為空

       語法:

 

[csharp]  view plain  copy
 
  1. [訪問修飾符]  <類名>()  
  2. {  
  3.   //構造函數的主體  
  4. }  

 

 

       構造函數分為實例構造函數、私有構造函數和靜態構造函數

      (1、)實例構造函數

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

        

[csharp]  view plain  copy
 
  1. class Program  
  2.     {  
  3.         public class cat  
  4.         {  
  5.             int i;  
  6.             public cat() //定義cat類的構造方法  
  7.             {  
  8.                 i = 4;  
  9.                 Console.WriteLine("The cat,{0} ", i);  
  10.             }  
  11.             static void Main(string[] args)  
  12.             {  
  13.                 cat cat1 = new cat();  
  14.                 Console.Read();  
  15.             }  
  16.         }  
  17.     }  

       首先定義了一個私有成員i,經過初始化給它賦了一個初值4,當實例化類cat時,就會執行實例構造函數。

 

     (2、)私有構造函數

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

 

[csharp]  view plain  copy
 
  1. class Program  
  2.     {  
  3.         public class dog  
  4.         {  
  5.             private dog()  
  6.             {  
  7.                 Console.WriteLine("this is dog");  
  8.             }  
  9.         }  
  10.         public class cat  
  11.         {  
  12.             int i;  
  13.             private cat() //定義cat類的構造方法  
  14.             {  
  15.                 i = 4;  
  16.                 Console.WriteLine("The cat,{0}", i);  
  17.             }  
  18.             static void Main(string[] args)  
  19.             {  
  20.                 dog dog1 = new dog();  //不可訪問,受保護級別限制而無法實例化  
  21.                 cat cat1 = new cat();  
  22.                 Console.Read();  
  23.             }  
  24.         }  
  25.     }  

         這是舉了一個錯誤的例子,即使在dog類中添加一個靜態成員,依舊無法創建dog類的實例。
      (3、)靜態構造函數

 

       靜態構造函數是實現對一個類進行初始化的方法成員。它一般用於對靜態數據的初始化。靜態構造函數不能有參數,不能有修飾符而且不能被調用,當類被加載時,類的靜態構造函數自動被調用。

 

[csharp]  view plain  copy
 
  1. class Program  
  2.     {  
  3.         public class dog  
  4.         {  
  5.             static int i;  
  6.             static dog()  
  7.             {  
  8.                 i = 1;  
  9.                 Console.WriteLine("the dog 默認構造函數 i={0}",i );  
  10.             }  
  11.         }  
  12.         public class cat  
  13.         {  
  14.             static void Main(string[] args)  
  15.             {  
  16.                 dog dog1 = new dog();  
  17.                 Console.Read();  
  18.             }  
  19.         }  
  20.     }  

       注意靜態構造函數只能對靜態數據成員進行初始化,而不能對非靜態數據成員進行初始化。但是,非靜態構造函數既可以對靜態數據成員賦值,也可以對非靜態數據成員進行初始化。

 

       三、析構函數

        析構函數是實現銷毀一個類的實例的方法成員。析構函數不能有參數,不能任何修飾符而且不能被調用。由於析構函數的目的與構造函數的相反,就加前綴‘~’以示區別。

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

        語法:

 

[csharp]  view plain  copy
 
  1. public class ResourceHolder   
  2.         {  
  3.             ......  
  4.             ~ResourceHolder()  
  5.             {  
  6.                 // 這里是清理非托管資源的用戶代碼段  
  7.             }  
  8.         }  

        構造函數與析構函數雖然是一個類中形式上較簡單的函數,但它們的使用決非看上去那么簡單,因此靈活而正確的使用構造函數與析構函數能夠更好的管理系統中的資源。繼續加油!!


免責聲明!

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



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