必须用 : base() 的情况是基类无无参构造函数且派生类未显式调用基类构造函数时;this() 用于同一类中构造函数间委托,避免重复初始化逻辑,且必须为首句、不可与 : base() 共存。

在 C# 中,构造函数的链式调用是指一个构造函数在初始化自身前,先调用同一类中的另一个构造函数(this()),或调用基类的构造函数(: base())。这是避免代码重复、提升可维护性的关键技巧。
什么时候必须用 : base()?
当基类没有无参构造函数,而派生类又没显式调用基类某个构造函数时,编译器会默认插入 : base() 调用无参构造函数 —— 这会导致编译错误。此时必须手动指定基类构造函数。
- 基类只定义了带参数的构造函数,如 public Person(string name)
- 派生类构造函数需传递必要参数给基类,例如:public Student(string name, int id) : base(name)
- 若不写 : base(name),编译器尝试调 base()(无参),但基类不存在该构造函数 → 报错
this():复用本类其他构造逻辑
this() 用于让一个构造函数委托给同一类中另一个构造函数执行,常见于提供多种参数组合时统一初始化流程。
- 例如:一个类支持无参、单参、双参构造,可以把核心初始化(如设置默认值、分配资源)放在最完整的构造函数里
- 其他构造函数通过 this(...) 调用它,避免重复写 _list = new List
(); 或 Initialize(); 等逻辑 - 注意:this() 必须是构造函数中第一句,且不能和 : base() 同时出现
链式调用的顺序和限制
构造函数链最终必须抵达一个“终点”——即不带 this() 或 : base() 的构造函数(通常是参数最全的那个),它负责实际初始化字段或调用 base(...)。
- 调用链是单向的:A → B → C,不能循环(A 调 B,B 又调 A)
- 每个构造函数最多只能有一个链式调用目标(要么 this(),要么 : base())
- 静态构造函数不能参与链式调用,也不能被 this() 或 : base() 调用
实用小技巧
合理设计构造函数链能显著减少冗余代码,也便于后期扩展。
- 把字段赋值、对象验证、资源初始化等“真正干活”的逻辑,集中放在参数最多的构造函数里
- 用 this() 实现默认值补全,比如 public MyClass() : this(0, "default") { }
- 继承场景下,优先保证 : base(...) 正确传递必要参数,再在派生类构造函数体中处理子类特有逻辑
基本上就这些。掌握 this() 和 : base() 不复杂但容易忽略细节,写多了自然就顺了。








