在我使用过的一个C#项目中,我遇到了以下代码段:

var session = new Session
{
    Application = /*!!!*/
    {
        PublicApplicationId = appId
    },
    LastActivityTime = DateTime.Now - TimeSpan.FromTicks(1)
};

我一段时间以前见过它,但直到现在我才接触到它.

我不再有权访问这些资源,所以我不知道Session级是什么意思.

但我想知道这在句法上是怎么可能的?

为什么只用大括号中的一些类似JSON的对象来初始化Application属性?

有什么好主意吗?

加法:/!!!/-我写这条 comments 是为了标记这个陌生的地方.那里什么都没有,没有"新的SomeClass"

UPD:谢谢你的回答! 下面是对这一功能的更易读的描述:https://fuqua.io/blog/2020/12/a-lesser-known-csharp-feature-nested-object-initializers/

推荐答案

没有新关键字的语法称为nested object initializer,我只能在specification中找到足迹

在等号后指定对象初始值设定项的成员初始值设定项是嵌套的对象初始值设定项,即嵌入对象的初始化.嵌套对象初始值设定项中的赋值被视为对字段或属性成员的赋值,而不是为字段或属性赋值.嵌套对象初始值设定项不能应用于值类型的属性,也不能应用于值类型的只读字段.

因此,应用程序属性不会被初始化,代码等同于

session.Application.PublicApplicationId = appId;

Csharp相关问答推荐

.NET将复杂的Dto序列化为SON字符串

火鸟DBC驱动程序未加载ADF DLC

获取Windows和Linux上的下载文件夹

System.Data.SQLite:判断SQLite数据库是否为空(任何表中至少有一行)

更改对象的旋转方向

Entity Framework Core 8 dbcontext—无法以多对多关系添加某些行'

WPF DataGrid中的三维数据

如何在C#中使用正则表达式抓取用逗号分隔的两个单词?

Appsettings.json未加载.Net 8 Blaazor Web程序集

System.Net.Http.HttpClient.SendAsync(request)在docker容器内的POST方法30秒后停止

使用ExtractIconEx(或其他方式)提取最大的可用图标

Lambda表达式如何与隐式强制转换一起工作?

为值对象编写自定义JsonConverter

C#多键字典和TryGetValue

在使用UserManager时,如何包含与其他实体的关系?

匿名类型的AbstractValidator

Blazor:搜索框在第一次搜索时不搜索

此异步方法在重写方法中缺少等待运算符警告

使用postman 测试配置了身份的.NET 6应用程序

用于分钟和秒验证的MudTextfield的正则表达式掩码