c#中构造函数不是方法,不能显式调用,仅在new时自动执行初始化;必须与类名同名、无返回类型;支持重载、this/base链式调用;禁用virtual成员访问;静态构造函数用于一次性静态初始化。

类的构造函数在 C# 中不是“方法”,不能像普通方法那样被显式调用,它的唯一作用是在创建对象时自动执行初始化逻辑。
public ClassName() 是最基础的构造函数定义方式
构造函数名必须与类名完全一致,且没有返回类型(连 void 都不能写)。它会在 new ClassName() 时由运行时自动触发。
- 如果没写任何构造函数,编译器会自动生成一个无参、空体的默认构造函数
- 一旦你定义了任意一个构造函数(哪怕带参数),编译器就不再生成默认构造函数
- 构造函数可以重载:允许同时存在
public Person()、public Person(string name)、public Person(string name, int age)
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
<pre class='brush:php;toolbar:false;'>// 无参构造函数
public Person()
{
Name = "Unknown";
Age = 0;
}
// 带参构造函数
public Person(string name, int age)
{
Name = name;
Age = age;
}}
构造函数链式调用要用 : this(...) 或 : base(...)
避免重复初始化代码,C# 支持在一个构造函数里调用本类另一个构造函数(: this(...))或父类构造函数(: base(...)),且必须是第一行语句。
-
: this(...)必须指向本类中已定义的某个构造函数,不能形成循环调用 -
: base(...)常用于继承场景,确保父类状态先被正确初始化 - 如果基类没有无参构造函数,子类构造函数必须显式调用
: base(...)
public class Employee : Person
{
public string Department { get; set; }
<pre class='brush:php;toolbar:false;'>// 调用基类构造函数,并传参
public Employee(string name, int age, string dept) : base(name, age)
{
Department = dept;
}
// 复用本类另一个构造函数
public Employee(string name, string dept) : this(name, 25, dept)
{
// 可以在这里补充仅此构造函数需要的逻辑
}}
构造函数里不能直接访问 virtual 成员或调用 virtual 方法
因为对象尚未完成初始化,此时虚方法分发可能指向子类重写版本,而子类字段还处于未赋值状态(默认为 null、0 等),极易引发 NullReferenceException 或逻辑错误。
- 常见陷阱:在基类构造函数中调用
virtual方法,而子类重写了它并访问了自己尚未初始化的字段 - 解决思路:把可变行为移到工厂方法、
Init()显式调用,或使用sealed禁止重写 - 静态构造函数(
static ClassName())不接受参数、不能显式调用、只执行一次,适合初始化静态资源
构造函数看着简单,但涉及初始化顺序、继承链、虚方法绑定这些底层机制。最容易被忽略的是:它不是普通方法,不能被反射直接 invoke(除非绕过访问限制),也不参与多态分发——它的行为在编译期就完全确定了。







