银行提款和存款程序C#

银行提款和存款程序C#,c#,methods,constructor,readonly,C#,Methods,Constructor,Readonly,我是C#的新手,目前正在研究创建一个简单的银行取款和存款程序的方法和构造器,以计算存款后的余额 我要么被这些指示弄糊涂了,要么我做错了什么。我只是想不通。我试图将初始默认余额设置为$1000,同时将余额字段设置为只读字段 我遇到的主要问题是,我正在尝试为只读“Balance”字段设置构造函数。C#是说我不能调用只读的方法。如果有人能帮我的话,我把我的代码贴在下面。先谢谢你 Account.cs class Account { public const double defaultBala

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

我要么被这些指示弄糊涂了,要么我做错了什么。我只是想不通。我试图将初始默认余额设置为$1000,同时将余额字段设置为只读字段

我遇到的主要问题是,我正在尝试为只读“Balance”字段设置构造函数。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;
    }
}
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);
        }
    }      
}
  • 公共属性(属性、字段、委托、事件或方法)应始终为PascalCase
  • 我的意思是,您应该将其作为参数传递给方法,而不是使用
    Amount
    属性
    DoWithdraw(十进制金额)
    DoDeposit(十进制金额)
  • 如我所见,您希望能够从类外读取
    Balance
    ,但只能通过类方法修改它。答案是使用自动实现的属性<代码>公共十进制余额{get;private set;}
  • 通常,一个帐户没有默认的初始值,如Dax Fohl所述。更合适的做法是使用构造函数来设置初始值
  • 通常,我们不使用“do”作为不定式动词的前缀,只使用
    draw
    Deposit
  • 正如Dax和Lars所说,对货币使用十进制数据类型更合适
  • 然后,您的
    帐户
    源代码将是:

    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;
        }
    }
    
    类帐户{
    公共十进制余额{get;private set;}
    公共账户(十进制初始余额){
    如果(初始余额<0)
    抛出新ArgumentOutOfRangeException(“初始余额必须大于或等于0”);
    这个平衡=初始平衡;
    }
    公共布尔存储(十进制金额){
    如果(金额)
    
  • 公共属性(属性、字段、委托、事件或方法)应始终为PascalCase
  • 您不应该使用
    Amount
    属性,而应该将其作为参数传递给方法,我的意思是;
    DoWithdraw(十进制金额)
    DoDeposit(十进制金额)
  • 如我所见,您希望能够从类外读取
    Balance
    ,但只能通过类方法修改它。答案是使用自动实现的属性;
    public decimal Balance{get;private set;}
  • 通常,一个帐户没有一个默认的初始值,如Dax Fohl所说。更合适的做法是使用一个构造函数来设置初始值
  • 通常,我们不使用“do”作为不定式动词的前缀,只使用
    draw
    Deposit
  • 正如Dax和Lars所说,对货币使用十进制数据类型更合适
  • 然后,您的
    帐户
    源代码将是:

    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;
        }
    }
    
    类帐户{
    公共十进制余额{get;private set;}
    公共账户(十进制初始余额){
    如果(初始余额<0)
    抛出新ArgumentOutOfRangeException(“初始余额必须大于或等于0”);
    这个平衡=初始平衡;
    }
    公共布尔存储(十进制金额){
    如果(金额1),请将其更改为控制台应用程序和类(存款、取款、检查余额、更改pin)

    2) 请将其更改为带有类的控制台应用程序(存款、取款、支票余额、更改pin)&使用所有OOP支柱(p>1)请将其更改为带有类的控制台应用程序(存款、取款、支票余额、更改pin)


    2) 请在控制台应用程序中使用类(存款、取款、检查余额、更改pin)进行更改使用所有OOP支柱时,

    您的
    余额属性上没有setter
    属性。@Steve说明要求我将余额设置为只读属性。如果允许我添加setter,则不会有问题。TLDR;我想您需要类似
    private decimal defaultBalance;
    的设置,为什么您的余额getter返回为t他是defaultBalance而不是实际余额?也是您试图设置帐户的值。余额在您标记的行上。您应该将acc.余额解析到文本字段中考虑到程序的性质,为
    余额设置一个setter是一个糟糕的设计。
    余额的任何更改都应该是结果存款、取款、转账、借记、贷记和
    账户的其他形式的交易
    对象您的
    余额
    属性上没有设置器。@Steve说明要求我将余额设置为只读属性。如果允许我添加设置器,这不会是一个问题。TLDR;我想您需要类似的设置
    private decimal defaultBalance;
    为什么您的余额获取程序返回的是默认余额而不是实际余额?您还试图设置account.Balance的值,您在第行标记了该值。您应该将acc.Balance解析到文本字段中。无论如何,为
    余额设置一个设置程序是不明智的程序的性质。
    余额
    的任何更改都应该是存款、取款、转账、借记、贷记和其他形式的交易到
    帐户
    对象的结果。我将
    默认余额
    放入
    程序.cs
    或其他地方,并将其传递到
    帐户
    构造函数中。这似乎很奇怪要使account类始终以设置的美元金额(而不是零)开头,请执行以下操作。此外,
    decimal
    在这里比
    double
    更合适。@TiesonT。由于余额设置器应该是私有的/受保护的,所以您不能这样做。我建议更新此答案以使用decimal而不是double。千万不要让货币接近浮点