如何更改只读变量的值?

4

我是一位有用的助手,可以为您进行文本翻译。

我有一个包含只读变量余额的账户类。 构造函数将默认值分配为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;
    }
}

据我所知,只读变量可以通过构造函数或字段进行赋值。

如果我调用 CashIn 方法时需要更新余额,是否可能呢? 如果是,请告诉我如何操作。


4
如果您想更改值,它就不是“只读”。 - maccettura
实际上,我得到了一个任务,要求保持平衡只读。那么我该怎么做呢?我怎么改变那个值? - jerin sifat
1
我认为你应该创建一个只读属性来返回变量值。 - Hadi
1
@jerinsifat,readonly 和一个 read only 属性之间有着巨大的区别。我想你的任务是使用一个只有 get 方法的属性(即只读属性)。 - maccettura
1
此外,您永远不应该使用“double”来存储货币值。这就是为什么存在“decimal”的原因。 - maccettura
显示剩余3条评论
5个回答

15

“readonly”修改符和“只读”属性的概念之间有很大的区别。

“readonly”修改符意味着您的字段只能在构造函数中设置。在构造函数之外,您将无法将该变量设置为任何其他值。考虑到您代码的上下文(银行账户模拟器),似乎很奇怪您会有一个永远不会改变的余额。这让我相信您想要一个只读属性。

属性是存储具有get/set方法的简单数据的首选方式。对于银行账户模拟器来说,仅公开具有公共setter的余额将非常糟糕,是吧?因此,在那种情况下,使用具有公共读取和私有设置的属性更有意义:

public decimal Balance { get; private set; }

这使得它可以被公开读取,但只允许在类内部进行修改(即从您编写的自定义方法中,如CashIn()

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

请注意我使用decimal而不是double。货币值应始终表示为decimal,这就是它存在的原因


3
很棒的答案,涵盖了我认为的一切。 - Marc Gravell
1
非常感谢。我误解了readonly属性,那是只读的。 - jerin sifat
2
有益且详细的答案 - Hadi
这是一个很大的区别。刚刚遇到了这个问题,本来期望readonly不允许值改变(即使在构造函数中),就像const一样。 - Xonatron

4
整个readonly的意义就是在构造函数中以外,你是不能这样做的。由于readonly是一种语言级别的特性,而不是严格的运行时保证:您可以通过反射、unsafe或其他各种邪恶方式进行欺骗。但在我看来,最实用的做法是:删除readonly修饰符。因为你似乎不希望它是只读的。

0

只读值可以在构造函数级别上更改。但可以在声明时初始化,并且也可以在构造函数级别上更改。


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

0
创建一个私有变量和一个公共只读属性,以返回其值,这样您就可以从同一类中编辑变量,但对其他类只读。
private double balance_;

public double Balance
{
    get
    {
        return balance_;
    }
 }

或者你可以使用私有设置

public double Balance { get; private set; }

请查看此链接以获取更多信息:了解私有设置器


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接