C# 对象方法10:构造方法重载和 this 关键字
1. 构造方法回顾
构造方法是在创建对象时自动调用的方法,用于初始化对象。
public class Equipment
{
public Equipment()
{
EquipId = 1000;
}
public int EquipId { get; set; }
}
创建对象时会自动调用构造方法:
Equipment equip = new Equipment();
构造方法特点:
名称必须和类名相同。 没有返回值,不能写 void。可以有参数,也可以没有参数。 可以重载。
2. 构造方法重载
一个类中可以定义多个构造方法,只要参数列表不同即可。
public classEquipment
{
public Equipment()
{
EquipId = 1000;
}
public Equipment(int equipId, string equipName)
{
EquipId = equipId;
EquipName = equipName;
}
public Equipment(int equipId, string equipName, string equipType)
{
EquipId = equipId;
EquipName = equipName;
EquipType = equipType;
}
publicint EquipId { get; set; }
publicstring EquipName { get; set; }
publicstring EquipType { get; set; }
}
调用示例:
Equipment equip1 = new Equipment();
Equipment equip2 = new Equipment(2000, "空压机2组");
Equipment equip3 = new Equipment(3000, "空压机3组", "KYJ-003");
3. 重载条件
构造方法重载依靠参数列表区分。
允许:
public Equipment()
{
}
public Equipment(int equipId)
{
}
public Equipment(int equipId, string equipName)
{
}
不允许:
public Equipment(int equipId)
{
}
// 错误:参数列表完全相同,不能只靠参数名不同区分
public Equipment(int id)
{
}
重载要求:
参数个数不同,或者 参数类型不同,或者 参数顺序不同。
不能通过返回值区分,因为构造方法本身没有返回值。
4. 无参构造方法的注意点
只有在类中没有任何构造方法时,编译器才会自动生成无参构造方法。
public class Equipment
{
public Equipment(int equipId)
{
EquipId = equipId;
}
public int EquipId { get; set; }
}
// Equipment equip = new Equipment(); // 错误:没有无参构造方法
如果希望对象创建时必须传入数据,可以故意不提供无参构造方法。
如果仍然需要无参创建对象,就要手动补上:
public Equipment()
{
}
5. 构造方法之间相互调用
当多个构造方法有重复初始化逻辑时,可以使用 this(...) 调用当前类中的其他构造方法。
public classEquipment
{
public Equipment(int equipId, string equipName)
{
this.EquipId = equipId;
this.EquipName = equipName;
}
public Equipment(int equipId, string equipName, string equipType)
: this(equipId, equipName)
{
this.EquipType = equipType;
}
publicint EquipId { get; set; }
publicstring EquipName { get; set; }
publicstring EquipType { get; set; }
}
执行:
Equipment equip = new Equipment(3000, "空压机3组", "KYJ-003");
执行顺序:
先调用 Equipment(int equipId, string equipName)。初始化 EquipId和EquipName。再回到三个参数的构造方法。 初始化 EquipType。
好处:减少重复代码,公共初始化逻辑只写一份。
6. this 关键字的两种常用作用
作用一:调用当前类的其他构造方法
public Equipment(int equipId, string equipName, string equipType)
: this(equipId, equipName)
{
EquipType = equipType;
}
注意:
this(...)必须写在构造方法声明后面的冒号后。被调用的构造方法会先执行。 不能形成循环调用。
作用二:表示当前对象
当参数名和字段名相同,使用 this 区分成员和局部变量。
private int equipId;
public Equipment(int equipId)
{
this.equipId = equipId;
}
说明:
this.equipId表示当前对象的字段。右边的 equipId表示构造方法参数。
7. 构造方法和对象初始化器
对象初始化器可以在创建对象后继续给属性赋值。
Equipment equip = new Equipment(2000, "空压机2组")
{
EquipType = "KYJ-002"
};
执行顺序:
先执行匹配的构造方法。 再执行对象初始化器中的属性赋值。
适合场景:
构造方法负责必填数据。 对象初始化器负责可选属性。
8. 实际开发建议
必填数据放到有参构造方法中,强制调用者传入。 可选数据可以使用属性或对象初始化器赋值。 多个构造方法有重复逻辑时,用 this(...)复用。不要为了方便写太多构造方法,参数过多时可以考虑对象初始化器或配置类。 构造方法中只做必要初始化,不建议写大量耗时业务。
示例:
public class Sensor
{
public Sensor(int no)
{
No = no;
}
public int No { get; }
public double Temperature { get; set; }
}
使用:
Sensor sensor = new Sensor(1)
{
Temperature = 25.6
};No 是创建时必须传入的数据,Temperature 是后续可以设置的数据。
9. 易错点
构造方法不能写返回值, void也不能写。自定义有参构造方法后,无参构造方法不会自动生成。 构造方法重载必须参数列表不同。 this(...)是调用当前类的其他构造方法。this.成员名是访问当前对象的字段、属性或方法。构造方法链不能循环调用。 对象初始化器在构造方法执行完成后才执行。
10. 小结
构造方法重载提供多种对象创建方式。 无参构造适合固定初始化,有参构造适合传入必要数据。 this(...)可以让构造方法之间复用代码。this.成员可以明确访问当前对象成员。删除无参构造方法可以强制调用者在创建对象时传入必要参数。