嵌套对象初始化器语法

Resharper刚给我建议了以下重构:

// Constructor initializes InitializedProperty but // the UninitializedSubproperty is uninitialized. var myInstance = new MyClass(); myInstance.InitializedProperty.UninitializedSubproperty = new MyOtherClass(); // becomes var myInstance = new MyClass { InitializedProperty = { UninitializedSubproperty = new MyOtherClass() } }; 

我以前从未见过这种对象初始化。 特别是我看不出来

 InitializedProperty = { UninitializedSubproperty = new MyOtherClass() } 

没有任何意义 – 它没有为InitializedProperty 分配任何东西。

是否在任何地方指定了此行

此语法称为对象初始化 。 C#规范清楚地给出了很多关于这个主题的例子:

7.6.10.2对象初始值设定项

对象初始值设定项由一系列成员初始值设定项组成,由{和}标记括起并用逗号分隔。 每个成员初始值设定项必须命名要初始化的对象的可访问字段或属性,后跟等号和表达式或对象初始值设定项或集合初始值设定项。 对象初始值设定项为同一字段或属性包含多个成员初始值设定项是错误的。 对象初始化程序无法引用它正在初始化的新创建的对象。

例子是:

 Rectangle r = new Rectangle { P1 = { X = 0, Y = 1 }, P2 = { X = 2, Y = 3 } }; 

编译为:

 Rectangle r = new Rectangle(); r.P1.X = 0; r.P1.Y = 1; r.P2.X = 2; r.P2.Y = 3; 

有:

 public class Rectangle { public Rectangle() { P1 = new Point(); //default Point for demo purpose P2 = new Point(); //default Point for demo purpose } public Point P1 { get; set; } public Point P2 { get; set; } } 

 public class Point { public int X { get; set; } public int Y { get; set; } } 

还可以考虑阅读一篇很棒的章节.8。C#深度书中简化初始化 。 Jon Skeet再次介绍了使用这种语法初始化树状结构的优点。