修改get accessor c#

时间:2017-03-24 14:12:58

标签: c# get set accessor

在不使用速记的情况下使用访问器相当新。我正在尝试基于另一个属性更改属性,而不能将其设置在其他位置。基本上我想这样做;

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”而且我理解这个问题,但我不知道得到如何解决它。

3 个答案:

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

}