一尘不染

嵌套对象初始化器语法

c#

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

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


阅读 309

收藏
2020-05-19

共1个答案

一尘不染

这种语法称为对象初始化。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.3简化初始化C#中深度 的书。Jon Skeet再次介绍了使用这种语法初始化树状结构的优点。

2020-05-19