.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