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