【问题标题】:Bank Withdraw and Deposit Program C#银行取款和存款程序 C#
【发布时间】:2023-03-26 20:07:01
【问题描述】:

我是 C# 新手,目前正在研究方法和构造函数,以创建一个简单的银行取款和存款程序来计算之后的余额。

我要么对给我的这些指示感到困惑,要么我做错了什么。我似乎无法弄清楚。我正在尝试将初始默认余额设置为 1000 美元,同时将余额字段设置为只读字段。

我遇到的主要问题是我正在尝试为只读“余额”字段设置构造函数。 C# 说我不能调用只读的方法。如果有人可以帮助我,我在下面发布了我的代码。提前谢谢你。

Account.cs

class Account
{
    public const double defaultBalance = 1000;
    private double _amount;
    public double balance;

    public double Balance
    {
        get { return defaultBalance; }
    }

    public double Amount
    {
        get
        {
            return _amount;              
        }
        set
        {
            if (value < 0)
            {
                throw new ArgumentException("Please enter an amount greater than 0");                  
            }
            else
            {
                _amount = value;
            }
        }
    }

    public double doDeposit()
    {          
        balance += _amount;
        return balance;
    }

    public double doWithdrawl()
    {
        balance -= _amount;

        if (balance < 0)
        {
            throw new ArgumentException("Withdrawing " + _amount.ToString("C") + " would leave you overdrawn!");
        }
        return balance;
    }
}

Main.cs

namespace Account_Teller
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    Account acc = new Account();

    private void btnWithdraw_Click(object sender, EventArgs e)
    {
        try
        {
            acc.Amount = double.Parse(txtAmount.Text);
            //Error in the line below. "Property cannot be assigned to -- it is read only
            //Trying to set the initial balance as $1000 using constructor from 'Account' class
            acc.Balance = double.Parse(lblBalance.Text);
            lblBalance.Text = acc.doWithdrawl().ToString("C");
        }
        catch (FormatException ex)
        {
            MessageBox.Show(ex.Message);
        }
        catch (ArgumentException ex)
        {
            MessageBox.Show(ex.Message);
        } 
        catch (Exception error)
        {
            MessageBox.Show(error.Message);
        }
    }

    private void btnDeposit_Click(object sender, EventArgs e)
    {
        try
        {
            acc.Amount = double.Parse(txtAmount.Text);
            lblBalance.Text = acc.doDeposit().ToString("C");
        }
        catch (FormatException ex)
        {
            MessageBox.Show(ex.Message);
        }    
        catch (ArgumentException ex)
        {
            MessageBox.Show(ex.Message);
        }
        catch (Exception error)
        {
            MessageBox.Show(error.Message);
        }
    }      
}

【问题讨论】:

  • 您的Balance 属性上没有设置器。
  • @Steve Instructions 要求我将 Balance 设置为只读属性。如果我被允许添加一个 setter 不会有问题。
  • TLDR;我认为你需要类似private decimal defaultBalance;
  • 为什么您的 Balance 获取器返回的是 defaultBalance 而不是实际余额?此外,您尝试设置 account.Balance 的值在线您标记了哪个。您应该将 acc.Balance 解析到文本字段中
  • 考虑到程序的性质,为Balance 设置一个setter 是不好的设计。对Balance 的任何更改都应该是存款的结果;提款;转让;借方; Account 对象的信用 和其他形式的交易

标签: c# methods constructor readonly


【解决方案1】:
  1. 公共属性(属性、字段、委托、事件或方法)应始终为 PascalCase
  2. 我的意思是,您应该将它作为参数传递给方法,而不是拥有Amount 属性; DoWithdraw(decimal amount)DoDeposit(decimal amount)
  3. 如我所见,您希望能够从类外部读取Balance,但只能通过类方法对其进行修改。答案是使用自动实现的属性; public decimal Balance { get; private set; }
  4. 通常,帐户没有默认初始值,如 Dax Fohl 所述。有一个可以让你设置初始值的构造函数更合适
  5. 通常我们不使用“do”作为不定式动词的前缀,只使用WithdrawDeposit
  6. 正如 Dax 和 Lars 所说,对货币使用十进制数据类型更为合适

那么,您的Account 源代码将是:

class Account {
    public decimal Balance { get; private set; }

    public Account(decimal initialBalance) {
        if(initialBalance < 0)
            throw new ArgumentOutOfRangeException("The initial balance must be greater or equals to 0");
        this.Balance = initialBalance;
    }

    public bool TryDeposit(decimal amount) {
        if(amount <= 0)
            return false;
        this.Balance += amount;
        return true;
    }

    public bool TryWithdraw(decimal amount) {
        if(amount <= 0 || this.Balance - amount < 0)
            return false
        this.Balance -= amount;
        return true;
    }
}

【讨论】:

  • 我会将DefaultBalance 放入Program.cs 或某处,然后将其传递给Account 构造函数。有一个总是以设定的美元金额(而不是零)开头的帐户类别似乎很奇怪。 decimal 也比 double 这里更贴切。
  • @TiesonT。由于平衡设置器应该是私有/受保护的,因此您将无法这样做。
  • 我建议更新此答案以使用十进制而不是双精度。永远不要让货币接近浮点数。 :)
  • @2niru 很有趣。很确定我以前确实这样做过,但是...
  • @LarsMøllebjerg 如果你们两个这么说。我以前没有处理过货币,但我会假设你是对的。
【解决方案2】:

1) 请将其更改为带有类的控制台应用程序(存款、取款、检查余额、更改密码)

2) 请将其更改为带有类(存款、取款、检查余额、更改密码)和使用所有 OOP 支柱的控制台应用程序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多