如何在不修改属性值的前提下检测C#对象属性是否小于0?
CheckingAccount Withdraw方法问题修复方案
问题根源
原代码的if ((Balance -= withdrawAmount) < 0)中,Balance -= withdrawAmount是赋值操作,会直接修改Balance的实际存储值,而非仅做逻辑判断。哪怕后续进入返回false的分支,已经被修改的余额也不会自动回滚,这就是测试后余额变成-200的核心原因。
修复后的代码
public class CheckingAccount : AccountBase { public override bool Withdraw(float withdrawAmount) { // 先计算扣除后的预期余额,不修改实际Balance float expectedBalance = Balance - withdrawAmount; if (expectedBalance < 0) { return false; } // 确认余额足够,再执行扣除操作 Balance = expectedBalance; return true; } }
测试验证
使用你提供的测试代码:
CheckingAccount cAccount = new CheckingAccount(); cAccount.Deposit(300); cAccount.Withdraw(500); Console.WriteLine(cAccount.Balance.ToString());
此时输出应为300,因为取款金额超过余额,方法返回false,Balance未被修改。
额外优化建议
- 增加对取款金额的合法性校验,避免负数取款:
if (withdrawAmount <= 0) { return false; } - 金融场景建议使用
decimal类型替代float,避免浮点数精度误差。
内容的提问来源于stack exchange,提问作者wargwan
相关产品推荐
相关产品推荐

