对象初始化程序、非公共子级和嵌套初始化

本文关键字:初始化 嵌套 程序 对象 | 更新日期: 2023-09-27 18:28:25

我查看了我的代码库,发现了一行代码,R#对我进行了有益的重构

public class A
{
    public B Target { get; private set; }
    public object E { get; set; }
    public A()
    {
        Target = new B();
    }
}
public class B
{
    public object C { get; set; }
    public object D { get; set; }
}
public static class Test
{
    static A LocalA;
    static void Initialize()
    {
        LocalA = new A
        {
            E = "obviously this should be settable",
            Target =
            {
                C = "Whoah, I can set children properties",
                D = "without actually new-ing up the child object?!"
            }
        };
    }
}

从本质上讲,初始化语法允许在不实际执行构造函数调用的情况下设置子对象的公共属性(显然,如果我从A的构造函数中提取Target构造函数调用,则由于空引用,整个初始化失败。

我已经搜索过了,但很难用谷歌的术语来表达。所以,我的问题是:(a)这到底叫什么?(b)在C#文档中,我在哪里可以找到更多关于它的信息?


编辑

似乎有其他人问过这个问题,但也没有找到类似的文档:嵌套对象初始值设定项语法

对象初始化程序、非公共子级和嵌套初始化

我在Object Initializers主题的文档中没有看到任何具体内容,但我确实对代码进行了反编译,以下是反编译后的实际情况:

        A a = new A();
        a.E = "obviously this should be settable";
        a.Target.C = "Whoah, I can set children properties";
        a.Target.D = "without actually new-ing up the child object?!";
        Test.LocalA = a;

Object Initializers上的一个已知事实是,它们总是首先运行构造函数。因此,这使得上面的代码能够工作。如果在A的构造函数中删除Target的初始化,则在尝试属性初始化程序时会出现异常,因为对象从未实例化。

这可能不是答案,我同意很难将其转化为谷歌理解的语言

在这种情况下,您将为CD赋值,它们是Target对象的公共属性

 LocalA.Target.C = "Whoah, I can set children properties";
 LocalA.Target.D = "without actually new-ing up the child object?! Nope I dont think so:)!"

您实际上并没有初始化new B(),因为Target的setter是Private。如果B没有初始化,这显然会失败。