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
