我查看了我的代码库,发现了一行 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/