3

我浏览了我的代码库,发现了 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# 文档中找到更多关于它的信息?


编辑

看起来有人问过这个问题,但没有找到类似的文档: 嵌套对象初始化器语法

4

2 回答 2

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尝试属性初始化器时会出现异常,因为该对象从未实例化。

于 2013-08-20T15:46:18.033 回答
0

这可能不是答案,我同意把它变成谷歌理解的语言真的很困难

C在这种情况下,您正在为对象D的公共属性分配值 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:)!"

您实际上并没有初始化 anew B()因为Targetsetter 是 Private。如果 B 未初始化,这显然会失败。

于 2013-08-20T16:14:22.147 回答