如何更改readonly变量的值?

时间:2018-02-14 20:31:43

标签: c#

我有一个包含只读变量余额的Account类。 构造函数将默认值指定为0。

但我想在调用CashIn方法时更新该值。 我试过这个:

class Account
{
    private string name;
    private readonly double balance;

    public Account(string n, double b)
    {
        name = n;
        balance = b;
    }

    public void CashIn(double amount)
    {
        balance = balance+amount;
    }
}

但据我所知,readonly变量可以通过构造函数或字段分配。

当我调用CashIn方法时,是否可以更新余额? 如果是,那么请描述我如何?

4 个答案:

答案 0 :(得分:5)

readonly修饰符与"只读"的概念之间存在差异属性。

readonly修饰符表示您的字段只能在构造函数中设置 。您将无法将该变量设置为构造函数之外的任何其他内容。鉴于您的代码(银行帐户模拟器)的上下文,您将获得永远不会发生变化的平衡似乎很奇怪。这让我相信你想要一个只读属性。

属性是存储具有get / set方法的简单数据的首选方式。对于银行账户模拟器来说,将公开制定者公开的余额暴露出去是非常糟糕的吗?所以我认为在这种情况下,拥有一个带有公共读取的属性和一个私有集合更有意义:

public decimal Balance { get; private set; }

这允许它被公开阅读,但它只允许在类中修改(即从你编写的自定义方法CashIn()

public void CashIn(decimal amount)
{
    Balance += amount;
}

请注意我如何使用decimal代替double。货币价值应始终表示为decimal,这是why it exists

答案 1 :(得分:3)

readonly的全部内容是不能执行此操作,但构造函数除外。由于readonly是语言级别的功能,而不是严格的运行时保证:您可以作弊(通过反射或unsafe或其他各种弊端),但在我看来,最务实的事情是:删除readonly修饰符。因为你似乎不希望它是只读的。

答案 2 :(得分:0)

创建一个私有变量,以及一个返回其值的Public Readonly Property,这样您就可以编辑同一个类中的变量,但它只能读取到其他类。

private double balance_;

public double Balance
{
    get
    {
        return balance_;
    }
 }

或者你可以使用私人套装

public double Balance { get; private set; }

点击此链接了解详情:understanding private setters

答案 3 :(得分:0)

一个简单的解决方案是删除变量的只读标记。一旦初始化,您就无法更改只读变量的值。 你可以在创建对象时初始化它,然后它将被视为该对象生命周期的常量。