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

时间:2015-11-30 16:58:43

标签: c#

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

class Person
{
    public string Name { get; }
    public Person(string name)
    {
        Name = name;
    }
}

尝试将值设置为属性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

你能解释一下为什么吗?

1 个答案:

答案 0 :(得分:11)

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

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

class Person
{
    private readonly string _name;

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

    public Person(string name)
    {
        _name = name;
    }
}

能够做到这一点非常非常有用

我很高兴它被添加到C#6中。