C#初始化语法

时间:2017-05-01 17:18:26

标签: c#

对于此课程设置。

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来说,这也不会像之前那样奇怪。

我只是在寻找一个语言功能关键字来查找或简单解释。

1 个答案:

答案 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会反对你的手臂对抗大括号的海洋。我更喜欢你原来的版本。