0

次のコードでは、内部ステータス フラグを使用する対象がわかりません: (C#)

// internal status flag
    private int status = 0;

    // status constants
    private const int AMOUNT_SET = 1;
    private const int RATE_SET = 2;
    private const int PERIODS_SET = 4;
    private const int ALL_SET = AMOUNT_SET | RATE_SET | PERIODS_SET;
public double LoanAmount
        {
            get
            {
                return this.loanAmount;
            }
            set
            {
                this.loanAmount = Math.Abs(value); //taking the absolute value of the user input to ensure getting  positive values
                this.status |= AMOUNT_SET;
                CalcPayment(); //check if the method can calculate yet 
            }
        }

 public double InterestRate
        {
            get
            {
                return this.interestRate;
            }
            set
            {
                this.interestRate = Math.Abs(value);
                if (this.interestRate >= 1)
                    this.interestRate /= 100;    // if entered as a percent, convert to a decimal
                this.status |= RATE_SET;
                CalcPayment();
            }
        }

        public int Periods
        {
            get
            {
                return this.periods;
            }
            set
            {
                this.periods = Math.Max(Math.Abs(value), 1);
                this.status |= PERIODS_SET;
                CalcPayment();
            }
        }

        public double MonthlyPayment
        {
            get
            {
                return this.monthlyPayment;
            }
        }

        public override string ToString()
        {
            return "\n\tThis is a loan of " + this.loanAmount.ToString("c") + " at " + this.interestRate.ToString("p") +
                    " interest for " + this.periods.ToString() + " months,\n\t\twith a monthly payment of " +
                    this.monthlyPayment.ToString("c") + ".";
        }

        private void CalcPayment()   
        {                              
            if (this.status == ALL_SET)
            {
                double periodicInterestRate = interestRate / 12;
                double compound = Math.Pow((1 + periodicInterestRate), periods);
                this.monthlyPayment = this.loanAmount * periodicInterestRate * compound /                   (compound - 1);
            }
        }

では、なぜ status フラグを使用したのでしょうか? ありがとう

4

3 に答える 3

2

これは、必要な関数がすべて呼び出されたことを確認する賢い方法です。

最初は、int としてのステータス フラグはバイナリで次のようになります。

0000  // truncated for clarity it would really be 32 0's

金額が設定されると、フラグは次のようになります。

0001 

レートが設定されると、次のようになります

0011 // because 2 in binary is ...0010, so ORing 0001 and 0010 -> 0011
于 2013-11-06T02:22:20.963 に答える
0

元の意図は、すべてのフィールドが設定されている場合にのみ計算が行われるということだったと思います。double と int はどちらもデフォルト値がそれぞれ 0.0d と 0 の値型であるため、フラグは重要です。

C# に Nullable 構造体またはショートカット T が含まれる前に、これが行われていることがわかりますか? 言語に含まれる場合。

于 2013-11-06T02:23:20.587 に答える
0

私はそれがeasier使用することであると言うでしょう

 if (this.status == ALL_SET)

次に、3 つの nullable を使用して実行します (疑似的な種類のコード)

 if (this.LoanAmount.HasValue && this.InterestRate.HasValue && this.Periods.HasValue)

私が思うコードの好み

于 2013-11-06T02:24:05.513 に答える