C#中集合初始化语法的名称、作用及省略()的场景与原因
代码中独立{}的语法说明及构造函数()省略规则
一、独立{}的语法名称与作用
你代码里的双层{ { ... } }是C#的集合初始化器+元素初始化器组合语法:
- 外层的
{}是集合初始化器:用来直接创建并初始化OpenApiSecurityRequirement实例,本质是语法糖——编译器会自动调用无参构造函数创建对象,然后把初始化器里的元素添加到集合中,省去了手动调用Add()方法的麻烦。 - 内层的
{}是集合元素初始化器:因为OpenApiSecurityRequirement是一种键值对类型的集合(键为OpenApiSecurityScheme,值为string[]),内层的{}用来定义集合中的单个键值对元素,把对应的OpenApiSecurityScheme实例和空字符串数组打包成一组元素,添加到集合里。
二、构造函数()的省略规则
你问的new OpenApiSecurityRequirement()能不能省略(),答案是完全可以,满足以下两个条件即可:
OpenApiSecurityRequirement拥有无参数构造函数(要么是编译器自动生成的默认无参构造,要么是开发者手动定义的);- 创建实例时紧接着使用了集合/对象初始化器(也就是后面跟着
{ ... })。
为什么能省略?
当你使用new 类型 { ... }的写法时,编译器会自动完成两个步骤:先调用该类型的无参构造函数创建实例,再执行初始化器里的元素添加或属性赋值逻辑。此时()属于冗余语法,省略后功能完全一致。
举个极简示例验证:
// 两种写法效果完全相同 var req1 = new OpenApiSecurityRequirement { /* 初始化内容 */ }; var req2 = new OpenApiSecurityRequirement() { /* 初始化内容 */ };
内容的提问来源于stack exchange,提问作者William YK
相关产品推荐
相关产品推荐

