可以在构造函数中分配只读属性。但是,当我尝试显式实现get方法时,编译器会显示错误(无法将属性分配给它-是只读的。)我可以实现getter还是应该没有实现?
public class PersonalIncome
{
private decimal _anualRate;
public decimal AnualRate
{
get { return _anualRate != 0 ? _anualRate : 40_000; }
}
public PersonalIncome(decimal paymentRate)
{
switch (paymentRate)
{
case var rate when (rate > 300):
AnualRate = rate; // **Property can not be assigned to -- it is read only.**
break;
default:
break;
}
}
}
答案 0 :(得分:2)
您可以实现getter,但随后只能将值直接分配给后备字段:
_anualRate = rate;
一旦您决定不使用自动属性,就必须自己做所有事情。
答案 1 :(得分:1)
您的班级可以这样重写:
public class PersonalIncome
{
public decimal AnualRate { get; private set; }
public PersonalIncome(decimal paymentRate)
{
AnualRate = paymentRate > 300 ? paymentRate : 40_000;
}
}
答案 2 :(得分:0)
您指的是具有readonly
后备字段的属性。
当使用具有默认值的自动实现的属性时,这正是编译器还从C#6向上生成的:
int MyProperty { get; } = -1;
这将被翻译为以下内容:
readonly int _myProperty = -1;
int MyProperty { get { return this._myProperty; } }
现在,编译器将用后备字段替换对属性的每次调用。但是,这仅适用于未定义主体的自动属性。在您的情况下,您已经有一个,这就是为什么编译器无法替换那个。由于属性本身就是一种获取方法和设置方法,因此您要做的是以下操作,这显然是毫无意义的:
int get_MyProperty() { return this._MyProperty; }
...
this.get_MyProperty() = 1;
之所以对自动属性起作用,是因为编译器知道如何替换对属性的调用。但是,假设您自己的吸气剂更加复杂:
get
{
DoSomething();
return this._myProperty + 5;
}
现在,编译器无法替换对该属性的调用。
因此,拥有自己的具有get-only属性的get-implementation tigether的唯一方法是使用backing-field:
this._myProperty = 1;