构造函数(C# 编程指南)

构造函数 是在创建 类实例或 结构 时运行时调用的方法。 类或结构可以有多个采用不同参数的构造函数。 构造函数使您能够确保类型的实例创建后是有效的。 有关详细信息和示例,请参阅实例构造函数使用构造函数

有几个操作是初始化新实例的一部分。 以下操作按以下顺序进行:

  1. 实例字段设置为 0。 此初始化通常由运行时完成。
  2. 字段初始值设定项运行。 派生程度最高类型的字段初始值设定项运行。
  3. 基类型字段初始值设定项运行。 以直接基开头从每个基类型到 System.Object 的字段初始值设定项。
  4. 基实例构造函数运行。 以 Object.Object 开头从每个基类到直接基类的任何实例构造函数。
  5. 实例构造函数开始运行。 该类型的实例构造函数运行。
  6. 对象初始值设定项运行。 如果表达式包含任何对象初始值设定项,则它们在实例构造函数运行后运行。 对象初始值设定项按文本顺序运行。

使用 new 运算符创建实例时,将执行上述操作。 如果将 struct 的新实例值设置为 default,则所有实例字段都会被设置为 0。 数组的元素在创建数组时设置为其默认值 0 或 null

静态构造函数(如果有)在对类型的任何实例执行任何实例构造函数操作之前运行。 静态构造函数最多运行一次。

构造函数语法

构造函数是一种与其类型同名的方法。 其方法签名可以包括可选的 访问修饰符、方法名称及其参数列表;它不包含返回类型。 以下示例显示了名为 Person的类的构造函数。

public class Person
{
   private string last;
   private string first;

   public Person(string lastName, string firstName)
   {
      last = lastName;
      first = firstName;
   }

   // Remaining implementation of Person class.
}

如果构造函数可以作为单个语句实现,则可以使用 表达式正文成员。 以下示例定义一个 Location 类,其构造函数具有一个名为 名称的字符串参数。 表达式正文定义将参数分配给 locationName 字段。

public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   }
}

如果类型需要参数来创建实例,则可以使用 主构造函数 指示实例化类型需要一个或多个参数,如以下示例所示:

public class LabelledContainer<T>(string label)
{
   public string Label { get; } = label;
   public required T Contents 
   { 
      get;
      init;
   }
}

静态构造函数

前面的示例显示了初始化新对象的实例构造函数。 类或结构还可以声明静态构造函数,该构造函数初始化类型的静态成员。 静态构造函数是无参数的。 如果未提供静态构造函数来初始化静态字段,C# 编译器会将静态字段初始化为默认值,如 C# 类型的默认值 文章中所列。

以下示例使用静态构造函数初始化静态字段。

public class Adult : Person
{
   private static int minimumAge;

   public Adult(string lastName, string firstName) : base(lastName, firstName)
   { }

   static Adult() => minimumAge = 18;

   // Remaining implementation of Adult class.
}

还可以使用表达式正文定义来定义静态构造函数,如以下示例所示。

public class Child : Person
{
   private static int maximumAge;

   public Child(string lastName, string firstName) : base(lastName, firstName)
   { }

   static Child() => maximumAge = 18;

   // Remaining implementation of Child class.
}

有关详细信息和示例,请参阅 静态构造函数

另请参阅