C#类型成员:构造函数

一、构造函数

  构造函数是类的特殊方法,它永远不会返回值(即使是void),并且方法名和类名相同,同样支持重载。在使用new关键字创建对象时构造函数被间接调用,为对象初始化字段和属性的值。

  无参构造函数即默认构造函数,在我们没有创建任何构造函数时,编译器会为我们创建一个默认构造函数,反之当我们创建了任何构造函数,编译器不会为我们创建默认构造函数。

  下面我们设计一个无构造函数的空调类,一个无默认构造函数的空调类和一个有多个构造函数的空调类,并实例化它们。

  1 /// 
  2 /// 空调Air
  3 /// 
  4 public class Air
  5 {
  6     #region 构造函数
  7     //默认构造函数的结构
  8     //public Air() { }
  9     #endregion
 10 
 11     #region 字段
 12     /// 
 13     /// 空调温度
 14     /// 
 15     public int temperature;
 16 
 17     /// 
 18     /// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
 19     /// 
 20     public int verticalDirection;
 21 
 22     /// 
 23     /// 空调开关(用int量化开关,0代表关,1代表开)
 24     /// 
 25     public int switch_C;
 26     #endregion
 27 }
 28 /// 
 29 /// 空调AirOther
 30 /// 
 31 public class AirOther
 32 {
 33     #region 构造函数
 34     /// 
 35     /// 一个参数构造函数
 36     /// 
 37     /// 
 38     public AirOther(int num)
 39     {
 40         //verticalDirection和switch_C会被设置为默认值0。
 41         temperature = num;
 42     }
 43 
 44     /// 
 45     /// 多参构造函数
 46     /// 
 47     /// 0代表关,1代表开
 48     /// 0代表下,1代表中下,2代表中,3代表中上,4代表上
 49     /// 空调温度
 50     public AirOther(int openOrClose, int upOrdown, int num)
 51     {
 52         temperature = num;
 53         verticalDirection = upOrdown;
 54         switch_C = openOrClose;
 55     }
 56     #endregion
 57 
 58     #region 字段
 59     /// 
 60     /// 空调温度
 61     /// 
 62     public int temperature;
 63 
 64     /// 
 65     /// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
 66     /// 
 67     public int verticalDirection;
 68 
 69     /// 
 70     /// 空调开关(用int量化开关,0代表关,1代表开)
 71     /// 
 72     public int switch_C;
 73     #endregion
 74 }
 75 /// 
 76 /// 空调AirConditioner
 77 /// 
 78 public class AirConditioner
 79 {
 80     #region 构造函数
 81     /// 
 82     /// 无参构造函数
 83     /// 
 84     public AirConditioner()
 85     {
 86         temperature = 28;
 87         verticalDirection = 3;
 88         switch_C = 0;
 89     }
 90 
 91     /// 
 92     /// 一个参数构造函数
 93     /// 
 94     /// 
 95     public AirConditioner(int num)
 96     {
 97         //verticalDirection和switch_C会被设置为默认值0。
 98         temperature = num;
 99     }
100 
101     /// 
102     /// 多参构造函数
103     /// 
104     /// 0代表关,1代表开
105     /// 0代表下,1代表中下,2代表中,3代表中上,4代表上
106     /// 空调温度
107     public AirConditioner(int openOrClose, int upOrdown, int num)
108     {
109         temperature = num;
110         verticalDirection = upOrdown;
111         switch_C = openOrClose;
112     }
113     #endregion
114 
115     #region 字段
116     /// 
117     /// 空调温度
118     /// 
119     public int temperature;
120 
121     /// 
122     /// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
123     /// 
124     public int verticalDirection;
125 
126     /// 
127     /// 空调开关(用int量化开关,0代表关,1代表开)
128     /// 
129     public int switch_C;
130     #endregion
131 }
132 /// 
133 /// 实现对象
134 /// 
135 public class RealizeObject
136 {
137     public void Realize()
138     {
139         //Air类无构造函数,创建airNotConstructor对象时会调用默认构造函数为它的所有int型字段赋默认值0。
140         Air airNotConstructor = new Air();
141 
142         //AirOther类不能使用new AirOther()创建对象,因为当我们创建了任何构造函数后,编译器不会为我们创建默认构造函数,此时如果想使用默认构造函数应显示创建。
143         //AirOther airNotDefaultConstructor = new AirOther();
144 
145         //在创建对象air过程中,调用的是AirConditioner类的无参构造函数,它为air的字段赋如下代码的值:
146         //air.temperature = 28;
147         //air.verticalDirection = 3;
148         //air.switch_C = 0;
149         AirConditioner air = new AirConditioner();
150 
151         //在创建对象airOne过程中,调用的是AirConditioner类的一个参数构造函数,它为对象的temperature赋值21,其他两个int型字段被赋默认值0。
152         AirConditioner airOne = new AirConditioner(21);
153 
154         //在创建对象airOpen18过程中,调用的是AirConditioner类的多参构造函数,并赋对应字段传入的值。
155         AirConditioner airOpen18 = new AirConditioner(1, 1, 18);
156     }
157 }

  默认构造函数为数据类型赋默认值如下:

  bool类型设置为false,

  数值类型设置为0或者0.0,

  char类型设置为单个空字符,

  DataTime类型设置为1/1/0001 12:00:00 AM,

  对象引用(包括string)设置为null。

 二、this关键字

  this关键字的作用之一是代表当前类,在方法的参数名与类的字段或属性名相同时,通过this.XXX代表类的字段或属性名,与方法的参数名区分开来。this关键字的作用之二是简化多构造函数中冗余的逻辑代码。

 1 /// 
 2 /// 洗衣机的类
 3 /// 
 4 public class WashingMachine
 5 {
 6     /// 
 7     /// 时长(单位:分钟)
 8     /// 
 9     public int duration;
10 
11     /// 
12     /// 衣物的总数量
13     /// 
14     public int clothesNum;
15 
16     public WashingMachine() { }
17 
18     public WashingMachine(int duration)
19     {
20         if (duration > 60)
21         {
22             duration = 60;
23         }
24         //通过this关键字区分类的字段名与构造函数的参数名
25         this.duration = duration;
26     }
27 
28     public WashingMachine(int duration, int clothesNum)
29     {
30         if (duration > 60)
31         {
32             duration = 60;
33         }
34         //通过this关键字区分类的字段名与构造函数的参数名
35         this.duration = duration;
36         this.clothesNum = clothesNum;
37     }
38 }

使用构造函数给洗衣机时长赋初始值时,超过60分钟的时长统一等于60分钟,此时多构造函数逻辑代码冗余。通过构造函数链的方式,以最多参数的构造函数为主函数,让其他构造函数通过最多参数的构造函数来初始化数据。

 1 /// 
 2 /// 洗衣机的类
 3 /// 
 4 public class WashingMachine
 5 {
 6     /// 
 7     /// 时长(单位:分钟)
 8     /// 
 9     public int duration;
10 
11     /// 
12     /// 衣物的总数量
13     /// 
14     public int clothesNum;
15 
16     public WashingMachine() { }
17 
18     public WashingMachine(int duration) : this(duration, 0) { }
19 
20     public WashingMachine(int clothesNum) : this(0, clothesNum) { }
21 
22     public WashingMachine(int duration, int clothesNum)
23     {
24         if (duration > 60)
25         {
26             duration = 60;
27         }
28         //通过this关键字区分类的字段名与构造函数的参数名
29         this.duration = duration;
30         this.clothesNum = clothesNum;
31     }
32 }

注意:当调用构造函数WashingMachine(int duration)时,会先进入主构造函数,主构造函数执行完成后,会返回到WashingMachine(int duration)构造函数执行其代码。

你可能感兴趣的:(C#类型成员:构造函数)