You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 10:13:16