.NET基礎之構造函數


1.構造函數

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

使用new表達式創建某個類的對象時,

1.1實例構造函數

(1)構造函數的名字與類名相同;

(2)使用new表達式創建類的對象或者結構,會調用其構造函數。並且通常初始化新對象的數據成員;

(3)除非是靜態的,否則會為沒有構造函數的類,自動生成一個默認的構造函數,並使用默認值來初始化對象字段

(4)構造函數可以有參數;

(5)構造函數可以以多態的形式存在多個構造函數;

(6)構造函數無返回值類型。

例:聲明Test類,有三個構造函數

 1     public class Test  2  {  3         int _aa, _bb;  4 
 5         public Test()  6  {  7             _aa += 10;  8             _bb += 10;  9             Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb)); 10  } 11         public Test (int value) 12  { 13             _aa += value; 14             _bb += value; 15             Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb)); 16  } 17         public Test(int x,int y) 18  { 19             _aa += x; 20             _bb += y; 21             Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb)); 22  } 23     }

測試如下:

 1    static void Main()  2  {  3        Test test1 = new Test();  4        Test test2 = new Test(100);  5        Test test3 = new Test(1000, 1000);  6  }  7     //Output:  8     //aa:10,bb:10  9     //aa:100,bb:100 10     //aa:1000,bb:1000

但是示例中的構造函數聲明,有時會顯得太羅嗦,尤其是當構造函數的功能相近時,可以改為如下的寫法:

 1     public class Practice  2  {  3         int _aa, _bb;  4         public Practice(int x,int y)  5  {  6             _aa += x;  7             _bb += y;  8             Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb));  9  } 10         public Practice(int value):this(value,value) 11  { 12  } 13         public Practice():this(10,10) 14  { } 15     }

或者更進一步,可以改為如下的寫法:

 1     public class Play  2  {  3         int _aa, _bb;  4         public Play(int x=100,int y=100)  5  {  6             _aa += x;  7             _bb += y;  8             Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb));  9  } 10     }

1.2靜態構造函數

(1)靜態構造函數不使用訪問修飾符;

(2)靜態構造函數不具有參數;

(3)在創建第一個實例或引用任何的靜態成員之前,將自動調用靜態構造函數實現初始化操作;

(4)不能直接調用靜態構造函數;

(5)用戶無法控制在程序中執行靜態構造函數的時間;

(6)如果靜態構造函數引發異常,運行時將不會再次調用該函數,並且類型在程序運行所在的應用程序域的生存期內將保持未初始化;

(7)靜態構造函數可以和實例構造函數並存。

例:

 1     public static int value = 10;  2  Program()  3  {  4         value = 100;  5  }  6     static Program()  7  {  8         value = 1000;  9  } 10     static void Main(string[] args) 11  { 12  Console.WriteLine(value); 13 
14         Program p = new Program(); 15  Console.WriteLine(Program.value); 16 
17  Console.ReadLine(); 18     }

打印結果為:(因為靜態構造函數的調用會早於構造函數)

1 //output
2   1000
3   100

1.3私有構造函數

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

當沒有實例字段或實例方法時或者當調用方法以獲得類的實例時,私有構造函數可用於阻止創建類的實例。

1.4編寫復制構造函數

 1 class Person  2 {  3     private string name;  4     private int age;  5 
 6     // Copy constructor.
 7     public Person(Person previousPerson)  8  {  9         name = previousPerson.name; 10         age = previousPerson.age; 11  } 12 
13     //// Alternate copy contructor calls the instance constructor.
14     //public Person(Person previousPerson) 15     // : this(previousPerson.name, previousPerson.age) 16     //{ 17     //} 18 
19     // Instance constructor.
20     public Person(string name, int age) 21  { 22         this.name = name; 23         this.age = age; 24  } 25 
26     // Get accessor.
27     public string Details 28  { 29         get
30  { 31             return name + " is " + age.ToString(); 32  } 33  } 34 } 35 
36 class TestPerson 37 { 38     static void Main() 39  { 40         // Create a new person object.
41         Person person1 = new Person("George", 40); 42 
43         // Create another new object, copying person1.
44         Person person2 = new Person(person1); 45  Console.WriteLine(person2.Details); 46 
47         // Keep the console window open in debug mode.
48         Console.WriteLine("Press any key to exit."); 49  Console.ReadKey(); 50  } 51 } 52 // Output: George is 40

Demo地址:

https://download.csdn.net/download/u010312811/10337475

參考

https://msdn.microsoft.com/zh-cn/library/k6sa6h87(v=vs.100).aspx

https://msdn.microsoft.com/zh-cn/library/kcfb85a6(v=vs.100).aspx

https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(v=vs.100).aspx

https://www.cnblogs.com/cang12138/p/8297270.html

 


免責聲明!

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



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