嵌套对象初始化器语法

Raw*_*ing 28 c# specifications object-initializers

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() }
    };
Run Code Online (Sandbox Code Playgroud)

我以前从未见过这种对象初始化.特别是我不知道怎么做

InitializedProperty = { UninitializedSubproperty = new MyOtherClass() }
Run Code Online (Sandbox Code Playgroud)

没有任何意义 - 它不会分配任何东西InitializedProperty.

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

Ily*_*nov 42

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

7.6.10.2对象初始值设定项

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

例如:

Rectangle r = new Rectangle
            {
                P1 = { X = 0, Y = 1 },
                P2 = { X = 2, Y = 3 }
            };
Run Code Online (Sandbox Code Playgroud)

编译为:

Rectangle r = new Rectangle();
r.P1.X = 0;
r.P1.Y = 1;
r.P2.X = 2;
r.P2.Y = 3;
Run Code Online (Sandbox Code Playgroud)

有:

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; }
}
Run Code Online (Sandbox Code Playgroud)

public class Point
{
    public int X { get; set; }
    public int Y { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

也可以考虑读一本伟大的篇章8.3简化初始化C#中深度的书.Jon Skeet再次介绍了使用这种语法初始化树状结构的优点.