2

0 から 1 までの値のみを受け入れる 10 進数の引数を持つメソッドを作成することは可能ですか?

例:

public decimal GetSamplingError(decimal percent){

    decimal result = 0;

    result = 100*percent;

    return result;

}

パラメータパーセントが0と1の間でcompresであることを制御することは可能ですか?

私の悪い英語に感謝し、申し訳ありません。

4

5 に答える 5

4

いいえ、パラメータの範囲を制御する方法はありません。できることは、関数自体の中で制御し、関数にコメントを追加することです

public decimal GetSamplingError(decimal percent){

     if(percent > 1) 
        percent = 1; 
     else if(percent <0) 
        percent = 0;

    return 100*percent;    
}

またはArgumentOutOfRangeException、パラメーターが望ましい範囲内にない場合に発生しますが、アプリケーションのワークフローをどのように管理したいかによって異なります。

于 2013-02-26T11:27:37.673 に答える
1

これをコンパイル時にチェックする方法はありません。最善の解決策は、実行時に引数を確認することです。

public decimal GetSamplingError(decimal percent)
{
    if (percent < 0m || percent > 1m)
    {
        throw new ArgumentException("Percent should be between 0 and 1!", "percent");
    }

    decimal result = 0;
    result = 100*percent;
    return result;
}

Tigran のアプローチ以外では、これは無効な引数が渡されたときに Exception をスローします。パーセント値を変更するよりも、この方法をお勧めします。間違った値を渡したことに実際に気付くからです。

Microsoftを使用する場合Code Contracts、値が特定の範囲内にあることを保証するコントラクトを追加できます。静的チェックを有効にすると、 にエラー メッセージが表示されcompile-timeます。

Contract.Requires(percent > 0m && percent < 1m, "Percent must be between 0 and 1");
于 2013-02-26T11:27:34.270 に答える
1

Percent他の人が提案したように、範囲チェックを使用して独自のタイプを作成し、いくつかの追加のものを作成します。そうPercentすれば、アプリケーション内の独自のエンティティであり、誰もがそれをいつ、どのように使用するかを知っています。単純な小数も同様に機能する可能性がありますが、私は型付きのアプローチを好みます。

 internal class Percent
    {
        private readonly decimal _value;
        public decimal Value
        {
            get { return _value; }
        }
        public Percent(decimal value)
        {
            _value = (100 * value);
            if (value < 0m || value > 1m)
            {
                throw new ArgumentOutOfRangeException("value");
            }
        }
        public override string ToString()
        {
            return String.Format("{0}%", _value);
        }
        public override int GetHashCode()
        {
            // HashCode implementation;
        }
        public override bool Equals(object obj)
        {
            // Equals implementation;
        }
    }
于 2013-02-26T11:42:40.663 に答える
0

あなたはしなければならないでしょう:

public decimal GetSamplingError(decimal percent){
    if (percent < 0m || percent > 1m)
        throw new ArgumentOutOfRangeException("percent", "Must be between 0 and 1.");

    // rest of method
}

もちろん、フィールドの値が常に必要な範囲内にあることを保証するチェックを書き込む、不変で 10 進数フィールドを保持する独自のstruct呼び出しを作成することも可能です。DecimalBetweenZeroAndOnereadonly

于 2013-02-26T11:28:44.253 に答える
0

値が期待どおりでない場合は、入力を検証して例外をスローすることができます。

    decimal getPercentage(decimal val)
    {
        if (val < 0 || val > 1)
            throw new ArgumentException();
        return val * 100;
    }
于 2013-02-26T11:29:40.687 に答える