2013-04-13 40 views
0

我試圖設置屬性的值,所以如果賬戶進入借記有一個10的費用是收取。我試過用很多方式編碼財產CurrentBalance,包括借記(10),價值-10和賬戶餘額-10,但這些方法都不起作用。代碼編譯但不收取費用。我究竟做錯了什麼?C#屬性 - 在setter訪問器中添加邏輯

public void Credit(decimal amount) 
    { 
     accountBalance += amount; //add to balance 
    } 

    public void Debit(decimal amount) 
    { 
     accountBalance -= amount; //subtract amount 
    } 

    public decimal CurrentBalance 
    { 
     get 
     { 
      return accountBalance; 
     } 
     set 
     { 
      if (value < 0) // if less than zero debit account by 10 
      { 
       value = accountBalance -10; // charge account 
      } 
      accountBalance = value; 
     } 
    } 
+2

我不認爲這屬於成setter函數在所有... – ThiefMaster

+0

@ThiefMaster,我認爲這取決於。這可能是應用程序的業務層,在這種情況下,我看到沒有錯誤 –

+0

我已經嘗試了下面的響應中的示例,它在setter中不起作用。 –

回答

4

這將是一個更好的方式來完成你想要的:

public void Credit(decimal amount) 
{ 
    accountBalance += amount; //add to balance 
} 

public void Debit(decimal amount) 
{ 
    accountBalance -= amount; //subtract amount 
    if(accountBalance < 0) 
    { 
     accountBalance -= 10; 
    } 
} 

//make this a readonly property and use the debit and credit functions to adjust it 
public decimal CurrentBalance 
{ 
    get 
    { 
     return accountBalance; 
    } 
} 
+0

這確實有用,謝謝。儘管我試圖測試get的功能,但是在練習冊中設置。 –

+0

@Dave B:難道你不是真的打電話給你的二傳手嗎?我在你的問題中發佈的代碼中沒有看到你這樣做。 –

3

您可以通過改變代碼解決它

set 
{ 
    if (value < 0) // if less than zero debit account by 10 
    { 
     accountBalance = value -10; // charge account 
    } else { 
     accountBalance = value; 
    } 
} 

然而,這不是一個好主意,做它在提供新的價值二傳手,因爲目前accountBalance被丟棄。這是更好地做到這一點在調整當前值的功能,如:

public decimal AdjustBy(decimal amount) { 
    accountBalance += amount; 
    if (accountBalance < 0 && amount < 0) { 
     // Charge fees on withdrawals when the resultant balance is < 0 
     accountBalance -= 10; 
    } 
} 
+0

你能舉一個這個功能的例子嗎? – CRice

+0

@CRice,什麼函數= –

+0

這也不起作用。我不確定它是否是主程序中的邏輯,但它在信用卡和借記卡上運行良好。我可以看到爲什麼一個函數會更好地工作。 –

2

我認爲這個問題是你是從不使用setter(至少在你發佈的代碼片段中)。在您的DebitCredit函數中,您正在設置基礎字段(accountBalance)的值,而不是屬性(CurrentBalance)。例如,如果你要像這樣uDate公司的Debit功能,它會使用屬性的setter,因此,收取一定的費用:

public void Debit(decimal amount) 
{ 
    CurrentBalance -= amount; //subtract amount 
} 

如果你總是會通過或者您的DebitCredit平衡互動功能,那麼我同意你簡單地把收費的邏輯在Debit功能的建議,而不是像這樣一個二傳手:

public void Debit(decimal amount) 
{ 
    accountBalance -= amount; //subtract amount 
    if(accountBalance < 0) 
    { 
     accountBalance -= 10; // Charge "overdraft" fee 
    } 
} 

如果你這樣做,你應該讓你的屬性只讀這樣它不會得到inad被某個人在路上垂直使用(從而繞過你的收費邏輯)。你可以通過簡單地不聲明你的財產的setter來做到這一點。

在另一方面,如果你在你的代碼,很多地方調整平衡,而不使用這些功能,我建議你做accountBalanceprivate場(如果沒有的話),然後設置在你的代碼的CurrentBalance而不是accountBalance值,像這樣:

CurrentBalance += amount; // add an amount 
CurrentBalance -= amount; // subtract an amount 
+0

喬恩,謝謝你的明確解釋。通過函數進行交互似乎就像我能夠最好地控制語言的邏輯。訪問私人領域看起來像使用財產給我的優勢。 –