每当创建类或结构的实例时,将会调用其构造函数。 类或结构可能具有采用不同参数的多个构造函数。 使用构造函数,程序员能够设置默认值、限制实例化,并编写灵活易读的代码。
有多个操作在初始化新实例时进行。 这些操作按以下顺序执行:
- 实例字段设置为 0。 这通常由运行时来完成;
- 字段初始值设定项运行。 派生程度最高类型的字段初始值设定项运行;
- 基类型字段初始值设定项运行。 以直接基开头从每个基类型到 System.Object 的字段初始值设定项;
- 基实例构造函数运行。 以 Object.Object 开头从每个基类到直接基类的任何实例构造函数;
- 实例构造函数运行。 该类型的实例构造函数运行;
- 对象初始值设定项运行。 如果表达式包含任何对象初始值设定项,后者会在实例构造函数运行后运行。 对象初始值设定项按文本顺序运行;
初始化新实例时,将执行上述操作。 如果 struct 的新实例设置为其 default 值,则所有实例字段都设置为 0。
如果静态构造函数尚未运行,静态构造函数会在任何实例构造函数操作执行之前运行。
构造函数语法
构造函数是一种方法,其名称与其类型的名称相同。 其方法签名仅包含可选访问修饰符、方法名称和其参数列表;它不包含返回类型。 以下示例演示一个名为 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 类,其构造函数具有一个名为“name”的字符串参数。 表达式主体定义给 locationName 字段分配参数。
public class Location
{private string locationName;public Location(string name) => Name = name;public string Name{get => locationName;set => locationName = value;}
}
静态构造函数
前面的示例具有所有已展示的实例构造函数,这些构造函数创建一个新对象。 类或结构也可以具有静态构造函数,该静态构造函数初始化类型的静态成员。 静态构造函数是无参数构造函数。 如果未提供静态构造函数来初始化静态字段,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.
}