我正在使用C#和Visual Studio 2015。
我有两个班级BankAccount和Wallet。 Wallet类有一个调用BankAccount实例的传输方法。但是,在我发送这些参数时,在我的表单代码中,它不会从源和目标余额中提取资金。
转移方式:
public void TransferFund(BankAccount source, BankAccount destination, double amount)
{
double Source = source.Balance;
double Destination = destination.Balance;
if (Source > amount)
{
Source -= amount;
Destination += amount;
}
else
{
throw new ArgumentException("Insufficient funds for transfer.");
}
}
单击表单按钮:
BankAccount from = lbTransferFrom.SelectedItem as BankAccount;
BankAccount to = lbTransferFrom.SelectedItem as BankAccount;
Wallet wall = new Wallet();
double amount = Convert.ToDouble(tbAmount.Text);
wall.TransferFund(from, to, amount);
问题:如何让源和目标对象实际更改余额?
答案 0 :(得分:2)
这两行
double Source = source.Balance;
double Destination = destination.Balance;
将.Balance
的值复制到变量。在下文中,您将更改余额的副本的值,但您永远不会重新分配每个帐户的余额。而不是复制值只是做
if (source.Balance >= amount) {
source.Balance -= amount;
destination.Balance += amount;
} else {
throw new ArgumentException("Insufficient funds for transfer.");
}
在C#中,您可以将值分成多个桶。值类型和引用类型。当您传递引用类型变量时,任何赋值或其他状态更改都将被所有引用("变量")反映到同一对象。每次将变量分配给另一个变量或将其作为参数传递时,使用值类型(大多数简单类型和所有结构)时,您将复制该值并传递副本。对副本的任何更改仅反映在该副本中,并且您经常会发现值类型实际上是不可变的,因此在您的情况下,作业double Source = source.Balance
和Source -= amount
都在创建副本并分配新创建的副本到Source
变量
所有这一切都说我希望这是一个有趣的项目,而不是生产。如果不是,您需要一些交易逻辑和更合适的帐户模型