关于c#:嵌套对象初始化器语法

Nested object initializer syntax

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

1
2
3
4
5
6
7
8
9
10
11
// 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() }
    };

我以前从未见过这种对象初始化。尤其是我不知道

1
InitializedProperty = { UninitializedSubproperty = new MyOtherClass() }

有任何意义——它没有给InitializedProperty分配任何东西。

这种行为在任何地方都有规定吗?


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

7.6.10.2对象初始值设定项0

例子有:

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

编译为:

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

有:

2

1
2
3
4
5
public class Point
{
    public int X { get; set; }
    public int Y { get; set; }
}

还可以考虑在C深入的书中阅读一个伟大的章节8.3简化的初始化。JonSkeet提供了使用这种语法初始化类树结构的另一个优点。