繁体   English   中英

修改get访问器C#

[英]Modifying get accessor 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;
        }
    }
}

这样就无法更改Tax属性本身,但是我收到一条错误消息,说“属性客户。不能分配给纳税人,因为它是只读的”,并且我理解了这个问题,但是我不知道如何解决这个问题。

这是吸气剂 您无需在getter中设置值。 如果使用它来设置值,那么它将是一个setter。 吸气剂只是得到一个值。 Tax “具有”的唯一值是getter返回的值。

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

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

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

没有分配...每次查询Tax ,都会计算其值。

最后,属性只是将“ getter”和“ setter”这两种方法“保持在一起”的绝招。通常,这两种方法在后备字段(保存属性值的字段)上“起作用”。 显然,在您的情况下,您没有后备领域,也没有二传手。 您只有一个总是被重新计算的吸气剂。 某些语言(如Java)没有这种“技巧”, getFoo()直接使用诸如getFoo()setFoo()类的属性,并且setFoo()得很好。

您还可以通过以下方法解决此问题:在设置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; }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM