.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

原文地址:https://www.cnblogs.com/imstrive/p/8763581.html