C#语言中的主要构造函数
内容提要
C# 12引入了主构造函数,允许在构造函数参数列表中直接定义和初始化属性。这简化了代码并提高了可读性。主构造函数可用于初始化属性、作为构造函数参数以及调用基类构造函数。它减少了样板代码并提高了代码的可读性。然而,它也有一些限制,比如无法将主构造函数参数作为字段或属性访问。总体而言,主构造函数是一个强大的功能,简化了代码并改善了代码组织。
延伸解读
主构造函数与普通构造函数的等价关系
文章通过多个示例展示了主构造函数如何等价于传统写法。例如,Employee 类用主构造函数初始化四个属性,与显式声明构造函数并逐个赋值的代码功能相同。这种等价性意味着迁移时不会改变运行时行为,但能减少重复的初始化语句,降低因遗漏或顺序错误引发的风险。
参数作用域与成员访问的边界
主构造函数的参数在整个类定义范围内可用,可用于初始化属性、字段或调用基类构造函数,但它们不是类的成员。因此不能通过 this.name 访问,也不会自动存储为字段或属性。若需在方法中引用,必须显式赋值给字段或属性,否则会引发编译错误。
可变性与构造函数重载的限制
主构造函数参数是可变的,可在类主体中被修改,这可能影响类型的不变性和线程安全性。若需只读,应使用 init 或 readonly 声明。此外,类或结构的所有其他构造函数都必须通过 this() 直接或间接调用主构造函数,这限制了构造函数重载的灵活性。
自定义验证与默认构造的补充
文章演示了如何通过自定义 init 访问器为主构造函数属性添加验证逻辑,例如检查薪资是否为负。同时,若类只有主构造函数,则没有无参数构造函数,尝试用默认构造函数创建对象会报错。可通过显式添加无参数构造函数并调用 this() 传入默认值来解决。
Q&A
C# 12中的主构造函数有什么特点?
主构造函数允许在构造函数参数列表中直接定义和初始化属性,简化了代码并提高了可读性。
如何使用主构造函数初始化类的属性?
可以在主构造函数中直接将参数赋值给属性,例如使用`public class Employee(string firstName, string lastName)`来初始化属性。
主构造函数有哪些局限性?
主构造函数的参数不能作为字段或属性访问,且默认不存储为字段,参数是可变的,限制了构造函数的重载。
主构造函数如何减少样板代码?
主构造函数通过直接在参数中初始化属性,减少了传统构造函数中重复赋值的样板代码。
如何在主构造函数中添加验证逻辑?
可以通过自定义访问器为主构造函数的属性添加验证逻辑,例如在设置属性值时检查有效性。
主构造函数如何调用基类构造函数?
可以在派生类的主构造函数中使用`: base(...)`语法将参数传递给基类的构造函数。