亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

掌握 C# 构造函数重载:灵活创建对象的多种姿势

C# 构造函数重载完全指南

深入掌握 C# 构造函数重载:通过变化参数个数、类型、顺序实现灵活对象初始化,附实战代码示例与设计建议。

C# 中的构造函数重载与方法重载原理一致:一个类可以声明多个同名(即类名)但签名不同的构造函数。编译器根据实例化时提供的实参自动选择匹配的构造函数。

构造函数签名的差异体现在三个维度:

阅读前建议先了解 C# 基础构造函数 概念。


1. 改变参数个数

最直观的重载方式:提供不同数量参数的构造函数。

class Car {
    // 无参构造函数
    Car() { ... }

    // 单参数构造函数
    Car(string brand) { ... }

    // 双参数构造函数
    Car(string brand, int price) { ... }
}

上述 Car 类三个构造函数共存,因为各自签名唯一。实例化时编译器按实参个数自动匹配。

示例:按参数个数重载

using System;

namespace ConstructorOverload {
    class Car {
        // 无参构造函数
        Car() {
            Console.WriteLine("Car 无参构造函数");
        }

        // 单参数构造函数
        Car(string brand) {
            Console.WriteLine("Car 单参数构造函数");
            Console.WriteLine("品牌: " + brand);
        }

        static void Main(string[] args) {
            // 调用无参构造函数
            Car car = new Car();
            Console.WriteLine();

            // 调用单参数构造函数
            Car car2 = new Car("Bugatti");
            Console.ReadLine();
        }
    }
}

输出

Car 无参构造函数
Car 单参数构造函数
品牌: Bugatti

编译器根据传入实参自动选择匹配的构造函数。


2. 改变参数类型

参数个数相同时,通过参数类型差异实现重载。

class Car {
    Car(string brand) { ... }
    Car(int price) { ... }
}

两个构造函数均接受单个参数,但类型分别为 string 与 int,签名不同。

示例:按参数类型重载

using System;

namespace ConstructorOverload {
    class Car {
        // string 参数构造函数
        Car(string brand) {
            Console.WriteLine("品牌: " + brand);
        }

        // int 参数构造函数
        Car(int price) {
            Console.WriteLine("价格: " + price);
        }

        static void Main(string[] args) {
            Car car = new Car("Lamborghini");
            Console.WriteLine();
            Car car2 = new Car(50000);
            Console.ReadLine();
        }
    }
}

输出

品牌: Lamborghini
价格: 50000

3. 改变参数顺序

参数个数、类型均相同但顺序不同,同样构成重载。

class Car {
    Car(string brand, int price) { ... }
    Car(int speed, string color) { ... }
}

两个构造函数均为 (string, int) 与 (int, string),参数类型序列不同,签名区分度足够。

示例:按参数顺序重载

using System;

namespace ConstructorOverload {
    class Car {
        // string 先,int 后
        Car(string brand, int price) {
            Console.WriteLine("品牌: " + brand);
            Console.WriteLine("价格: " + price);
        }

        // int 先,string 后
        Car(int speed, string color) {
            Console.WriteLine("速度: " + speed + " km/h");
            Console.WriteLine("颜色: " + color);
        }

        static void Main(string[] args) {
            Car car = new Car("Bugatti", 50000);
            Console.WriteLine();
            Car car2 = new Car(60, "Red");
            Console.ReadLine();
        }
    }
}

输出

品牌: Bugatti
价格: 50000
速度: 60 km/h
颜色: Red

进阶技巧:构造函数链调用(this())

为避免代码重复,可在一个构造函数中调用另一个:

class Car {
    public string Brand { get; set; }
    public int Price { get; set; }
    public string Color { get; set; }

    // 主构造函数(最完整参数)
    public Car(string brand, int price, string color) {
        Brand = brand;
        Price = price;
        Color = color;
    }

    // 通过 this() 调用主构造函数,提供默认值
    public Car(string brand, int price) : this(brand, price, "Black") { }
    public Car(string brand) : this(brand, 0, "Black") { }
    public Car() : this("Unknown", 0, "Black") { }
}

这种构造函数链模式将初始化逻辑集中在主构造函数中,其他构造函数仅负责提供默认值,极大提升可维护性。


设计建议

C语言

  1. 汽车发动机冷却液详解:作用、类型与保养
  2. C# 构造函数:类型、示例与高级模式完全指南
  3. 理解 C# 嵌套类:定义、访问与继承实战
  4. 掌握 C# 方法重载:核心概念、实战示例与最佳实践
  5. C++ 运算符重载实战指南:语法、方法、限制与代码示例
  6. C++重载机制深度解析:函数重载与运算符重载全攻略
  7. C# 运算符重载完全指南:自定义类型的运算符行为定义
  8. 精通 Python 运算符重载:实战指南
  9. 精通 Java 构造器:类型、用法与实战示例
  10. Java 枚举构造器详解与实战示例
  11. Java 构造器重载详解:规则、链式调用与实战代码
  12. 理解 Java 构造器:初始化与最佳实践