我正在尝试设置该属性的值,因此如果该帐户进入借记,则需要收取10的费用。我尝试过多种方式对属性CurrentBalance进行编码,包括借记(10),值-10和账户余额-10,但这些方法都不起作用。代码编译但不收取费用。我做错了什么?
public void Credit(decimal amount)
{
accountBalance += amount; //add to balance
}
public void Debit(decimal amount)
{
accountBalance -= amount; //subtract amount
}
public decimal CurrentBalance
{
get
{
return accountBalance;
}
set
{
if (value < 0) // if less than zero debit account by 10
{
value = accountBalance -10; // charge account
}
accountBalance = value;
}
}
答案 0 :(得分:5)
这将是一个更好的方法来实现你想要的:
public void Credit(decimal amount)
{
accountBalance += amount; //add to balance
}
public void Debit(decimal amount)
{
accountBalance -= amount; //subtract amount
if(accountBalance < 0)
{
accountBalance -= 10;
}
}
//make this a readonly property and use the debit and credit functions to adjust it
public decimal CurrentBalance
{
get
{
return accountBalance;
}
}
答案 1 :(得分:3)
您可以通过将代码更改为
来解决此问题set
{
if (value < 0) // if less than zero debit account by 10
{
accountBalance = value -10; // charge account
} else {
accountBalance = value;
}
}
但是,在提供新值的setter中执行此操作并不是一个好主意,因为当前accountBalance
会被丢弃。最好在调整当前值的函数中执行此操作,如下所示:
public decimal AdjustBy(decimal amount) {
accountBalance += amount;
if (accountBalance < 0 && amount < 0) {
// Charge fees on withdrawals when the resultant balance is < 0
accountBalance -= 10;
}
}
答案 2 :(得分:2)
我认为问题是你从不使用setter (至少在你发布的代码片段中)。在Debit
和Credit
函数中,您要设置基础字段(accountBalance
)的值,而不是属性(CurrentBalance
)。例如,如果你像这样更新你的Debit
函数,它会使用属性的setter,因此收取费用:
public void Debit(decimal amount)
{
CurrentBalance -= amount; //subtract amount
}
如果您始终通过Debit
或Credit
函数与余额互动,那么我同意您只需将费用逻辑放入{ {1}}函数,而不是像这样的setter:
Debit
如果您这样做,您应该将您的属性设置为只读,以便不会被无意中使用的人(因此绕过您的费用逻辑)。你可以通过简单地不为你的财产声明一个setter来做到这一点。
另一方面,如果您的代码中有很多地方可以调整余额而不使用这些功能,我建议您将public void Debit(decimal amount)
{
accountBalance -= amount; //subtract amount
if(accountBalance < 0)
{
accountBalance -= 10; // Charge "overdraft" fee
}
}
设为accountBalance
字段(如果还没有),然后在代码中设置private
而不是CurrentBalance
的值,如下所示:
accountBalance