C#属性 - 在setter访问器中添加逻辑

时间:2013-04-13 12:51:55

标签: c# if-statement properties set

我正在尝试设置该属性的值,因此如果该帐户进入借记,则需要收取10的费用。我尝试过多种方式对属性CurrentBalance进行编码,包括借记(10),值-10和账户余额-10,但这些方法都不起作用。代码编译但不收取费用。我做错了什么?

    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;
        }
    }

3 个答案:

答案 0 :(得分:5)

这将是一个更好的方法来实现你想要的:

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;
    }
}

答案 1 :(得分:3)

您可以通过将代码更改为

来解决此问题
set
{
    if (value < 0) // if less than zero debit account by 10
    {
        accountBalance = value -10; // charge account
    } else {
        accountBalance = value;
    }
}

但是,在提供新值的setter中执行此操作并不是一个好主意,因为当前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;
    }
}

答案 2 :(得分:2)

我认为问题是你从不使用setter (至少在你发布的代码片段中)。在DebitCredit函数中,您要设置基础字段(accountBalance)的值,而不是属性(CurrentBalance)。例如,如果你像这样更新你的Debit函数,它会使用属性的setter,因此收取费用:

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

如果您始终通过DebitCredit函数与余额互动,那么我同意您只需将费用逻辑放入{ {1}}函数,而不是像这样的setter:

Debit

如果您这样做,您应该将您的属性设置为只读,以便不会被无意中使用的人(因此绕过您的费用逻辑)。你可以通过简单地不为你的财产声明一个setter来做到这一点。

另一方面,如果您的代码中有很多地方可以调整余额而不使用这些功能,我建议您将public void Debit(decimal amount) { accountBalance -= amount; //subtract amount if(accountBalance < 0) { accountBalance -= 10; // Charge "overdraft" fee } } 设为accountBalance字段(如果还没有),然后在代码中设置private而不是CurrentBalance的值,如下所示:

accountBalance