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
分配任何内容。
是否在任何地方指定了此行为?
答案 0 :(得分:40)
此语法称为Object Initialization。 C#规范清楚地给出了很多关于这个主题的例子:
对象初始值设定项 由一系列成员初始化器组成,由{和}括起来 标记以逗号分隔。每个成员初始化程序必须命名 随后被初始化的对象的可访问字段或属性 通过等号和表达式或对象初始化器或 集合初始化器。对象初始值设定项是错误的 包括同一字段或多个成员初始值设定项 属性。对象初始化程序无法引用 它正在初始化的新创建的对象。
例如:
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再次介绍了使用这种语法初始化树状结构的优点。