在我参与过的一个 C# 项目中,我遇到了以下代码:
var session = new Session
{
Application = /*!!!*/
{
PublicApplicationId = appId
},
LastActivityTime = DateTime.Now - TimeSpan.FromTicks(1)
};
Run Code Online (Sandbox Code Playgroud)
我很久以前就见过它,但直到现在我才接触到它。
我无法再访问源代码,所以不知道Session类是什么意思。
但我想知道这在语法上怎么可能?
为什么该Application属性仅由大括号中的一些类似 JSON 的对象初始化?
有任何想法吗?
添加: / !!!/ - 我写这个评论是为了标记这个奇怪的地方。那里什么都没有,没有“new SomeClass”
UPD:感谢您的回答!这是此功能的更易于理解的描述:https://fuqua.io/blog/2020/12/a-lesser-known-csharp-feature-nested-object-initializers/
没有 new 关键字的语法称为嵌套对象初始值设定项,我只能在规范中找到足迹
在等号之后指定对象初始值设定项的成员初始值设定项是嵌套对象初始值设定项,即嵌入对象的初始化。嵌套对象初始值设定项中的赋值将被视为对字段或属性的成员的赋值,而不是向字段或属性赋值新值。嵌套对象初始值设定项不能应用于具有值类型的属性,也不能应用于具有值类型的只读字段。
所以 Application 属性没有被初始化,代码相当于
session.Application.PublicApplicationId = appId;
Run Code Online (Sandbox Code Playgroud)