c# - 对象初始值设定项、非公共(public)子项和嵌套初始化

标签 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?!"
            }
        };
    }
}

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

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


编辑

看起来有人问过这个问题,但发现类似的缺乏文档: Nested object initializer syntax

最佳答案

我在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 的初始化,您将在尝试属性初始化程序时遇到异常,因为该对象从未被实例化。

关于c# - 对象初始值设定项、非公共(public)子项和嵌套初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18338859/

相关文章:

c# - Winforms - 文本框中要显示的文本的下划线部分

c# - 如何比较两个 List<String> ?

c# - 如何指定 UdpPacket 的源端口?

c# - new DateTime() 和 DateTime.Parse 的不同结果

variables - Go 初始化运算符,包范围变量 - 混淆 :

c# - 嵌套对象初始化语法

java - 重新初始化 Java 类

c++ - 调用者是否应该初始化 "out"参数?

C# 对象初始化程序将初始化只读属性,但仅适用于非原始类型