嵌套对象初始化器语法

时间:2013-05-28 14:42:09

标签: 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() }
    };

我以前从未见过这种对象初始化。特别是我不知道如何

InitializedProperty = { UninitializedSubproperty = new MyOtherClass() }

没有任何意义 - 它不是InitializedProperty分配任何内容。

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

1 个答案:

答案 0 :(得分:40)

此语法称为Object Initialization。 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; }
}

另请考虑阅读 C#深度一书中的 8.3简化初始化一章。 Jon Skeet再次介绍了使用这种语法初始化树状结构的优点。