主构造函数
C# 12引入了一个名为“Primary Constructors”的新特性,允许您以更简洁和灵活的方式定义类和结构体的构造函数。本文将探讨Primary Constructors的各个方面,包括语法、作用域、参数初始化和属性生成。
# 语法
定义Primary Constructor的语法如下:
class MyClass(int x, string y)
{
// 构造函数体
}
这里,int x
和string y
是Primary Constructor的参数。请注意,参数列表在类名之后用括号括起来。如果Primary Constructor不需要任何其他逻辑,则无需定义显式构造函数体。
您还可以按以下方式为结构体定义Primary Constructor:
struct MyStruct(int x, string y)
{
// 构造函数体
}
# 作用域
Primary Constructor参数在整个类或结构体的体内都是有效的。这意味着您可以在类或结构体的任何方法或属性中使用它们,而无需重新定义它们。
class MyClass(int x, string y)
{
public int GetX() => x;
public string GetY() => y;
}
在这里,我们定义了两个方法GetX和GetY,它们分别使用Primary Constructor参数x和y。
# 参数初始化
为了确保所有Primary Constructor参数都被赋值,所有明确声明的构造函数必须使用this()
语法调用Primary Constructor。
class MyClass(int x, string y)
{
public MyClass(int x) : this(x, "default")
{
}
// 其他构造函数
}
在这里,我们定义了另一个只使用x参数的构造函数,并使用x参数和y参数的默认值调用Primary Constructor。这保证了x和y都将被初始化。
# 属性生成
编译器仅在记录类型中为Primary Constructor参数生成公共属性,记录类型可以是记录类或记录结构体类型。非记录类和结构体可能并不总是希望这种行为。
record MyRecord(int X, string Y);
class MyClass(int x, string y)
{
// 其他成员
}
在这里,我们定义了一个记录类型MyRecord,有两个Primary Constructor参数X和Y。编译器将自动为这些参数生成公共属性。
但是,对于非记录类和结构体,您可以选择是否为Primary Constructor参数生成属性。为此,您需要使用init
关键字:
class MyClass
{
public int X { get; init; }
public string Y { get; init; }
public MyClass(int x, string y)
{
X = x;
Y = y;
}
}
在这里,我们定义了一个类MyClass,有两个属性X和Y,它们由Primary Constructor参数x和y初始化。我们使用init
关键字来确保属性只能在对象初始化期间设置,并且不能在之后修改。
# 结论
Primary Constructors是C# 12 的一个强大新功能,允许您以更简洁和灵活的方式定义类和结构体的构造函数。它们提供更好的构造函数参数作用域,保证参数初始化,并允许您控制为Primary Constructor参数生成属性。