×

C# 对象方法[10]:构造方法重载和 this 关键字

独孤求败 独孤求败 发表于2026-06-14 22:06:33 浏览32 评论0

抢沙发发表评论

C# 对象方法10:构造方法重载和 this 关键字

1. 构造方法回顾

构造方法是在创建对象时自动调用的方法,用于初始化对象。

public class Equipment
{
    public Equipment()
    {
        EquipId = 1000;
    }

    public int EquipId { getset; }
}

创建对象时会自动调用构造方法:

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 { getset; }
    publicstring EquipName { getset; }
    publicstring EquipType { getset; }
}

调用示例:

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 { getset; }
}

// 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 { getset; }
    publicstring EquipName { getset; }
    publicstring EquipType { getset; }
}

执行:

Equipment equip = new Equipment(3000"空压机3组""KYJ-003");

执行顺序:

  1. 先调用 Equipment(int equipId, string equipName)
  2. 初始化 EquipId 和 EquipName
  3. 再回到三个参数的构造方法。
  4. 初始化 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"
};

执行顺序:

  1. 先执行匹配的构造方法。
  2. 再执行对象初始化器中的属性赋值。

适合场景:

  • 构造方法负责必填数据。
  • 对象初始化器负责可选属性。

8. 实际开发建议

  • 必填数据放到有参构造方法中,强制调用者传入。
  • 可选数据可以使用属性或对象初始化器赋值。
  • 多个构造方法有重复逻辑时,用 this(...) 复用。
  • 不要为了方便写太多构造方法,参数过多时可以考虑对象初始化器或配置类。
  • 构造方法中只做必要初始化,不建议写大量耗时业务。

示例:

public class Sensor
{
    public Sensor(int no)
    {
        No = no;
    }

    public int No { get; }
    public double Temperature { getset; }
}

使用:

Sensor sensor = new Sensor(1)
{
    Temperature = 25.6
};

No 是创建时必须传入的数据,Temperature 是后续可以设置的数据。

9. 易错点

  • 构造方法不能写返回值,void 也不能写。
  • 自定义有参构造方法后,无参构造方法不会自动生成。
  • 构造方法重载必须参数列表不同。
  • this(...) 是调用当前类的其他构造方法。
  • this.成员名 是访问当前对象的字段、属性或方法。
  • 构造方法链不能循环调用。
  • 对象初始化器在构造方法执行完成后才执行。

10. 小结

  • 构造方法重载提供多种对象创建方式。
  • 无参构造适合固定初始化,有参构造适合传入必要数据。
  • this(...) 可以让构造方法之间复用代码。
  • this.成员 可以明确访问当前对象成员。
  • 删除无参构造方法可以强制调用者在创建对象时传入必要参数。


群贤毕至

访客