C# 嵌套对象初始值设定项语法

C# 嵌套对象初始值设定项语法,c#,specifications,object-initializers,C#,Specifications,Object Initializers,Resharper刚刚向我建议了以下重构: // Constructor initializes InitializedProperty but // the UninitializedSubproperty is uninitialized. var myInstance = new MyClass(); myInstance.InitializedProperty.UninitializedSubproperty = new MyOtherClass(); // becomes var

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

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

此语法被调用。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; }
}

还考虑阅读<强> C深> <强>书中的8.3章简化初始化。Jon Skeet还介绍了使用这种语法初始化树状结构的优点

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


还考虑阅读<强> C深> <强>书中的8.3章简化初始化。Jon Skeet还介绍了使用这种语法初始化树状结构的优点

啊,谢谢你在说明书上给我发邮件-这并不像所有的例子在网上那么容易找到,而且我找到的例子中没有一个是简单的顶级作业。规范确实说对象初始值设定项本身可以包含对象初始值设定项,我想这是关键。@Rawling是的,
对象初始值设定项
有一个伪代码,正如C#规范为所有构造给出的那样。我不想把它带到这里,因为格式已经完全丢失了。你指的是标准的哪个版本?据我所知,相关章节是4.5版和5.0版中的7.6.10.2。哇,我也不知道这一点,规范中也没有任何例子。非常酷和有用的功能。我看到了GitHub的问题,我有一个相关的问题。如果有一个额外的嵌套级别,我们必须将一个参数传递到“newpoint(someArg)”,其中someArg是在构造矩形()时定义/设置的。谢谢,谢谢你在说明书上给我发邮件-要在网上找到所有的例子并不容易,而且我找到的所有例子除了简单的顶级作业外,没有一个能做任何事情。规范确实说对象初始值设定项本身可以包含对象初始值设定项,我想这是关键。@Rawling是的,
对象初始值设定项
有一个伪代码,正如C#规范为所有构造给出的那样。我不想把它带到这里,因为格式已经完全丢失了。你指的是标准的哪个版本?据我所知,相关章节是4.5版和5.0版中的7.6.10.2。哇,我也不知道这一点,规范中也没有任何例子。非常酷和有用的功能。我看到了GitHub的问题,我有一个相关的问题。如果有一个额外的嵌套级别,我们必须将一个参数传递到“newpoint(someArg)”,其中someArg是在构造矩形()时定义/设置的。感谢可能的副本可能的副本