我正在查看我的代码库,并找到了一行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
答案 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)
这可能不是答案,我同意将其变成谷歌理解的语言非常困难
在这种情况下,您要将值分配给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:)!"
您实际上并未初始化new B()
,因为Target
设置者是私有的。如果B未初始化,这显然会失败。