.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