对于此课程设置。
public class X
{
public Y YInstance;
public X()
{
YInstance = new Y();
}
}
public class Y
{
public long Z;
}
我有这段代码。
var x = new X();
x.YInstance.Z = 1;
Resharper有一个使用对象初始值设定项的提示,它将我的代码转换为此。
var x = new X { YInstance = { Z = 1 } };
我熟悉使用括号填充属性的常规对象初始化,但我不确定这是做什么的。看看IL,它似乎没有设置YInstance,这是我的第一个猜测。对于Resharper来说,这也不会像之前那样奇怪。
我只是在寻找一个语言功能关键字来查找或简单解释。
答案 0 :(得分:8)
严格地说,语法是任意的,但在我看来,考虑它的方法是YInstance = { Z = 1 }
没有new
关键字,因此它不会调用任何构造函数。但是,语法的初始化部分是存在的,所以它只是将初始化器应用于(希望!)现有YInstance
的属性。 YInstance存在于您的案例中,因为您在X
构造函数中创建了它。 Here's what would happen if you didn't。
而不是"设置YInstance到这个东西",它"将YInstance的属性设置为那些的东西&# 34 ;.
在这种情况下, = { ... }
表示将初始化程序应用于属性的现有值。
表示在属性名称和初始化程序括号之间使用=
起初可能看起来不是很直观,但它就是它,就像任何语法一样,您学会很快就能识别它。您可以执行相同操作来初始化已创建的集合项:
public class C {
public List<int> Items { get; } = new List<int>();
}
...
// This can't be assigning to Items, because it's read-only
var c = new C { Items = { 0, 1, 2 } };
其中一位C#团队成员(如果你提到他的名字,他会出现)once kindly took the time to comment on an answer to a question about the list initializer syntax。他们踢了很多,但这是他们提出的最佳选择。在为成熟语言添加语法时,需要考虑很多因素。它们使程序员尽可能清楚地失去了大量的睡眠,但同时它必须对编译器毫不含糊,它不能破坏现有的代码等等。&#34;语法是任意的& #34;并不意味着C#团队做出任意决定。
我无法解释为什么Resharper会反对你的手臂对抗大括号的海洋。我更喜欢你原来的版本。