对象初始化器,非公共子级和嵌套初始化

时间:2013-08-20 15:19:11

标签: c# initialization object-initializers

我正在查看我的代码库,并找到了一行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?!"
            }
        };
    }
}

本质上,初始化语法允许设置子对象的公共属性而不实际执行构造函数调用(显然,如果我从Target的构造函数中调用A构造函数调用,整个初始化将因为空引用。

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


修改

看起来其他人已经发现类似缺少文档的问题: Nested object initializer syntax

2 个答案:

答案 0 :(得分:2)

我在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上的一个已知事实是它们总是首先运行构造函数。所以,这使得上面的代码工作。如果在Target的构造函数中删除A的初始化,则在尝试使用属性初始值设定项时会出现异常,因为该对象从未实例化过。

答案 1 :(得分:0)

这可能不是答案,我同意将其变成谷歌理解的语言非常困难

在这种情况下,您要将值分配给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设置者是私有的。如果B未初始化,这显然会失败。