2017-09-15 83 views
0

我是C#的新手,目前正在使用方法和構造函數創建一個簡單的銀行取款和存款程序來計算餘額後。銀行取款和存款程序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); 
     } 
    }  
} 
+0

你不必在你的'Balance'屬性的設置。 – Steve

+0

@Steve指令要求我將Balance設置爲只讀屬性。如果我被允許添加一個setter,那不會是個問題。 – hyang24

+0

TLDR;我想你需要像'private decimal defaultBalance;' – Timeless

回答

3
  1. 公共屬性(屬性,字段,代表,事件或方法)應當總是PascalCase
  2. 而不是具有Amount屬性,您應該通過作爲方法的參數,我的意思是; DoWithdraw(decimal amount)DoDeposit(decimal amount)
  3. 正如我所看到的,您希望能夠從課程外部讀取Balance,但只能通過類方法修改它。答案是使用自動實現的屬性; public decimal Balance { get; private set; }
  4. 通常情況下,賬戶沒有默認的初始值,正如Dax Fohl所述。它更appropiate有可以讓你設置一個初始值
  5. 通常是一個構造函數,我們不使用「做」作爲前綴不定式動詞,只是WithdrawDeposit
  6. 作爲Dax和拉斯說,它更appropiate到使用貨幣

十進制數據類型,那麼,你的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; 
    } 
} 
+3

我會把'DefaultBalance'放到'Program.cs'或其他地方,然後傳遞給'Account'構造函數。擁有一個始終以一定金額(非零)開始的賬戶類似乎很奇怪。在這裏,'decimal'也比'double'更合適。 –

+0

@TiesonT。由於平衡制定者應該是私人/受保護的,您無法做到這一點。 – 2niru

+2

我建議更新此答案以使用十進制代替double。切勿讓貨幣靠近浮動點。 :) –