在不使用速记的情况下使用访问器相当新。我正在尝试基于另一个属性更改属性,而不能将其设置在其他位置。基本上我想这样做;
public int Salary { get; set; }
public int Tax
{
get
{
if (Salary > 2000)
{
return Tax = 20;
}
else if (Salary > 1500)
{
return Tax = 10;
}
else
{
return Tax = 5;
}
}
}
因此无法更改Tax属性本身,但是我收到一条错误,说“属性Customer.Tax无法分配给它,因为它是readonly”而且我理解这个问题,但我不知道得到如何解决它。
答案 0 :(得分:5)
它是 getter 。您没有在getter中设置值。如果您使用它来设置值,那么它将是一个setter。 getter只是得到一个值。 Tax
"的唯一价值是"是吸气剂返回的任何东西。
public int Tax
{
get
{
if (Salary > 2000)
{
return 20;
}
else if (Salary > 1500)
{
return 10;
}
else
{
return 5;
}
}
}
如果祖母有轮子,她就是火车。如果你只是制定一个规则"永远不会在吸气器中设置任何东西,那么你生活中的不确定性会相当沉淀。
唯一的例外是为readonly属性初始化一个私有支持字段,该属性返回一个只需要初始化一次的昂贵对象:
private ReadOnlyCollection<String> _states;
public ReadOnlyCollection<String> States; {
get {
if (_states == null) {
_states = new ReadOnlyCollection(DB.GetStates().ToList());
}
return _states;
}
}
答案 1 :(得分:4)
如果Tax
是只读的,则它非常类似于&#34; classic&#34;方法(如GetTax()
):
public int Tax
{
get
{
if (Salary > 2000)
{
return 20;
}
else if (Salary > 1500)
{
return 10;
}
else
{
return 5;
}
}
}
没有作业...每次查询Tax
时,都会计算其值。
最后,一个属性只是一个诀窍,即“保持在一起”#34;两种方法,一个吸气剂和一个二传手...通常这两种方法&#34; act&#34;在后备字段(保存属性值的字段)上。显然,在你的情况下,你没有一个支持领域,也没有一个二传手。您只有一个总是重新计算的吸气剂。有些语言(如Java)没有这个&#34;技巧&#34;,并直接使用getFoo()
和setFoo()
这样的属性,并且生活得非常好。
答案 2 :(得分:0)
您还可以通过在设置Salary属性时确定税金,以及为Tax属性使用私有设置器来解决此问题。 这意味着你每次打电话都不需要重新计算税金(授予它,这对于这些小数字不会有很大的影响,但取决于项目,这将有用)
public class PayCheck {
private double _salary = -1;
public double Salary {
get => _salary;
set {
_salary = value;
if (value > 2000)
Tax = 20;
else if (value > 1500)
Tax = 10;
else
Tax = 5;
}
}
public double Tax { get; private set; }
}