37

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.

这种行为是否在任何地方指定?

4

1 回答 1

51

这种语法称为对象初始化。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 Simplified initialization in C# in depth book。Jon Skeet 提供了另一种使用这种语法初始化树状结构的优势。

于 2013-05-28T14:48:19.347 回答