2017-03-24 108 views
0

使用访问器而不使用简写的新手段。我试图改变基于另一个属性的属性,但不能将其设置在别的地方。基本上我想要像这样;修改get访问器c#

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; 
     } 
    } 
} 

因此,它是不可能的,能够改变税收属性本身,但是我得到一个错误说“物权Customer.Tax不能被分配到,因为它是只读的,”我理解的问题,但我不知道如何解决它。

+1

所以,你明白你不能分配任何东西给'Tax',但你不知道如何解决一个错误,告诉你你试图给'Tax赋值?如果你知道你不能这样做,而你正在这样做,你知道你不需要这样做...... – Servy

回答

4

如果Tax是只读的,那么它是非常相似的“经典”的方法(如GetTax()):

public int Tax 
{ 
    get 
    { 
     if (Salary > 2000) 
     { 
      return 20; 
     } 
     else if (Salary > 1500) 
     { 
      return 10; 
     } 
     else 
     { 
      return 5; 
     } 
    } 
} 

没有分配...您查询Tax每一次,它的价值计算。

最后,一个属性只是一个把两个方法“吸引”在一起的技巧,一个getter和一个setter ...通常,这两个方法对后台字段起作用(属性值的字段被保存)。显然在你的情况下,你没有支持领域,并没有一个setter。你只有一个总是重新计算的吸气剂。有些语言(如Java)没有这个“技巧”,并直接使用像getFoo()setFoo()这样的属性,并且生活得很好。

5

这是一个getter。您不要在getter中设置值。如果你使用它来设置值,它将是一个setter。获得者只需获得的值。 Tax“拥有”的唯一值就是getter返回的值。

public int Tax 
{ 
    get 
    { 
     if (Salary > 2000) 
     { 
      return 20; 
     } 
     else if (Salary > 1500) 
     { 
      return 10; 
     } 
     else 
     { 
      return 5; 
     } 
    } 
} 

如果奶奶有轮子,她会是火车。如果你只是制定一条规则“永远不要在吸气器中设置任何东西”,那么你生活中的不确定性就会有一定程度的降低。

唯一的例外是初始化的私人支持字段为返回一个昂贵的对象,只需要进行一次初始化的只读属性:

private ReadOnlyCollection<String> _states; 
public ReadOnlyCollection<String> States; { 
    get { 
     if (_states == null) { 
      _states = new ReadOnlyCollection(DB.GetStates().ToList()); 
     } 
     return _states; 
    } 
} 
0

您也可以解决这个问题,通过确定税收设置时Salary属性,以及使用Tax属性的私有setter。 这意味着您不必在每次给他们打电话时都重新计算税金(理所当然,这些数字不会有什么大不了的,但取决于项目,这将有用)

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; } 

}