为什么可以通过构造函数分配只读属性?

Tân*_*Tân 2 c#

我设置属性Name是只读的,但它仍然可以分配.

class Person
{
    public string Name { get; }
    public Person(string name)
    {
        Name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试将值设置为property Name:

var p = new Person("Kevin");            
Console.WriteLine(p.Name); //output: Kevin
p.Name = "John"; //Property or indexer 'Person.Name' cannot be assigned to -- it is read only
Run Code Online (Sandbox Code Playgroud)

你能解释一下为什么吗?

Jon*_*eet 13

只能在构造函数或初始化程序中为属性声明赋值 - 就像只读字段只能在构造函数或字段初始值设定项中分配一样.

将不会生成属性setter - 编译器将使用只读字段,并在构造函数中初始化它.因此,生成的代码将大致相当于:

class Person
{
    private readonly string _name;

    // Old school: public string Name { get { return _name; } }
    public string Name => _name; 

    public Person(string name)
    {
        _name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是巨大的,能够做到这一点是有用的,我真的很高兴它被添加到C#6.