我有一个包含只读变量余额的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
方法时,是否可以更新余额?
如果是,那么请描述我如何?
答案 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)
一个简单的解决方案是删除变量的只读标记。一旦初始化,您就无法更改只读变量的值。 你可以在创建对象时初始化它,然后它将被视为该对象生命周期的常量。