我设置属性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
你能解释一下为什么吗?
答案 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中。