C#中构造函数调用后大括号初始化语法是什么?
问题解答
你看到的是C#的集合初始化器语法,核心原因是:这种写法不是给Reminders属性重新赋值,而是调用该属性返回的集合实例的Add方法,往里面添加元素。
具体拆解:
- 首先,
SampleCustomer里的Reminders是只读属性(只有get访问器,用表达式体=>实现),它返回的是类内部已经初始化好的私有字典_reminders实例。 - 你写的
{ Reminders = { ... } }属于对象初始化器的嵌套写法,这里的=不是赋值操作——因为Reminders是只读的,直接赋值会编译报错。这个语法的实际逻辑是:- 先调用
SampleCustomer的构造函数创建对象实例。 - 访问该实例的
Reminders属性,获取到内部的Dictionary<DateTime, string>对象。 - 对这个字典对象应用集合初始化器,也就是依次调用它的
Add方法,把{ new DateTime(...), "xxx" }这些键值对添加进去。
- 先调用
等价的手动代码:
你看到的初始化代码完全等价于:
SampleCustomer c = new SampleCustomer("customer one", new DateTime(2010, 5, 31)); c.Reminders.Add(new DateTime(2010, 08, 12), "childs's birthday"); c.Reminders.Add(new DateTime(1012, 11, 15), "anniversary");
为什么能这么用?
只要一个对象实现了IEnumerable接口,并且包含匹配参数的Add方法(这里字典的Add(DateTime, string)正好匹配初始化器里的键值对格式),就可以用这种集合初始化器语法来添加元素——不管这个对象是通过属性获取的,还是直接创建的。
内容的提问来源于stack exchange,提问作者bigSloppy
相关产品推荐
相关产品推荐

