C#无显式构造函数调用的对象初始化语法疑问
问题
在我的C#项目中实例化新对象时,遇到了一种特殊情况:
var person = new Person { Firstname = "John", Lastname = "Doe" };
如你所见,这段代码未显式调用构造函数就完成了对象初始化,却未抛出任何错误或警告。我熟悉如下标准对象初始化方式:
var person = new Person() // <- calling the constructor explicitly { Firstname = "John", Lastname = "Doe" };
但从未见过此类写法,想请教该写法的生效原理、可行原因及与标准写法的差异。
解答
生效原理
这是C#对象初始化器语法的简化写法,编译器会自动帮你补上无参构造函数的调用。编译时,这段代码会被转换成和带()的写法完全一致的IL代码:先调用Person的无参构造函数创建对象实例,再依次给Firstname和Lastname属性赋值。
可行原因
C#语法允许在使用对象初始化器时省略无参构造函数的括号,只要对应的类存在能被当前代码调用的无参构造函数即可:
- 若
Person类未显式定义任何构造函数,编译器会自动生成一个公共的无参构造函数; - 若
Person类显式定义了无参构造函数,且访问权限足够(比如public),这种写法就能正常运行。
与标准写法的差异
- 语法层面:只是少了一对括号,属于语法糖,没有功能上的区别;
- 编译结果:两种写法编译后的IL代码完全相同,运行时行为没有任何差异;
- 限制场景:如果
Person类没有无参构造函数(比如仅定义了带参数的构造函数),两种写法都会编译失败,必须使用带参数的构造函数配合对象初始化器,或者直接在构造函数中传入参数。
内容的提问来源于stack exchange,提问作者Patrick Cerny
相关产品推荐
相关产品推荐

