欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#类型成员:构造函数

程序员文章站 2023-11-23 11:26:22
一、构造函数 构造函数是类的特殊方法,它永远不会返回值(即使是void),并且方法名和类名相同,同样支持重载。在使用new关键字创建对象时构造函数被间接调用,为对象初始化字段和属性的值。 无参构造函数即默认构造函数,在我们没有创建任何构造函数时,编译器会为我们创建一个默认构造函数,反之当我们创建了任 ......

一、构造函数

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

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

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

  1 /// <summary>
  2 /// 空调air
  3 /// </summary>
  4 public class air
  5 {
  6     #region 构造函数
  7     //默认构造函数的结构
  8     //public air() { }
  9     #endregion
 10 
 11     #region 字段
 12     /// <summary>
 13     /// 空调温度
 14     /// </summary>
 15     public int temperature;
 16 
 17     /// <summary>
 18     /// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
 19     /// </summary>
 20     public int verticaldirection;
 21 
 22     /// <summary>
 23     /// 空调开关(用int量化开关,0代表关,1代表开)
 24     /// </summary>
 25     public int switch_c;
 26     #endregion
 27 }
 28 /// <summary>
 29 /// 空调airother
 30 /// </summary>
 31 public class airother
 32 {
 33     #region 构造函数
 34     /// <summary>
 35     /// 一个参数构造函数
 36     /// </summary>
 37     /// <param name="num"></param>
 38     public airother(int num)
 39     {
 40         //verticaldirection和switch_c会被设置为默认值0。
 41         temperature = num;
 42     }
 43 
 44     /// <summary>
 45     /// 多参构造函数
 46     /// </summary>
 47     /// <param name="openorclose">0代表关,1代表开</param>
 48     /// <param name="upordown">0代表下,1代表中下,2代表中,3代表中上,4代表上</param>
 49     /// <param name="num">空调温度</param>
 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     /// <summary>
 60     /// 空调温度
 61     /// </summary>
 62     public int temperature;
 63 
 64     /// <summary>
 65     /// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
 66     /// </summary>
 67     public int verticaldirection;
 68 
 69     /// <summary>
 70     /// 空调开关(用int量化开关,0代表关,1代表开)
 71     /// </summary>
 72     public int switch_c;
 73     #endregion
 74 }
 75 /// <summary>
 76 /// 空调airconditioner
 77 /// </summary>
 78 public class airconditioner
 79 {
 80     #region 构造函数
 81     /// <summary>
 82     /// 无参构造函数
 83     /// </summary>
 84     public airconditioner()
 85     {
 86         temperature = 28;
 87         verticaldirection = 3;
 88         switch_c = 0;
 89     }
 90 
 91     /// <summary>
 92     /// 一个参数构造函数
 93     /// </summary>
 94     /// <param name="num"></param>
 95     public airconditioner(int num)
 96     {
 97         //verticaldirection和switch_c会被设置为默认值0。
 98         temperature = num;
 99     }
100 
101     /// <summary>
102     /// 多参构造函数
103     /// </summary>
104     /// <param name="openorclose">0代表关,1代表开</param>
105     /// <param name="upordown">0代表下,1代表中下,2代表中,3代表中上,4代表上</param>
106     /// <param name="num">空调温度</param>
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     /// <summary>
117     /// 空调温度
118     /// </summary>
119     public int temperature;
120 
121     /// <summary>
122     /// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
123     /// </summary>
124     public int verticaldirection;
125 
126     /// <summary>
127     /// 空调开关(用int量化开关,0代表关,1代表开)
128     /// </summary>
129     public int switch_c;
130     #endregion
131 }
132 /// <summary>
133 /// 实现对象
134 /// </summary>
135 public class realizeobject
136 {
137     public 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 /// <summary>
 2 /// 洗衣机的类
 3 /// </summary>
 4 public class washingmachine
 5 {
 6     /// <summary>
 7     /// 时长(单位:分钟)
 8     /// </summary>
 9     public int duration;
10 
11     /// <summary>
12     /// 衣物的总数量
13     /// </summary>
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 /// <summary>
 2 /// 洗衣机的类
 3 /// </summary>
 4 public class washingmachine
 5 {
 6     /// <summary>
 7     /// 时长(单位:分钟)
 8     /// </summary>
 9     public int duration;
10 
11     /// <summary>
12     /// 衣物的总数量
13     /// </summary>
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)构造函数执行其代码。