C# 构造函数方法 C#如何定义类的构造函数

7次阅读

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

C# 构造函数方法 C#如何定义类的构造函数

类的构造函数在 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 方法

因为对象尚未完成初始化,此时虚方法分发可能指向子类重写版本,而子类字段还处于未赋值状态(默认为 NULL0 等),极易引发 NullReferenceException 或逻辑错误。

  • 常见陷阱:在基类构造函数中调用 virtual 方法,而子类重写了它并访问了自己尚未初始化的字段
  • 解决思路:把可变行为移到工厂方法、Init() 显式调用,或使用 sealed 禁止重写
  • 静态构造函数(Static ClassName())不接受参数、不能显式调用、只执行一次,适合初始化静态资源

构造函数看着简单,但涉及初始化顺序、继承链、虚方法绑定这些底层机制。最容易被忽略的是:它不是普通方法,不能被反射直接 invoke(除非绕过访问限制),也不参与多态分发——它的行为在编译期就完全确定了。

text=ZqhQzanResources