2

是否可以创建一个带有小数参数的方法,它只接受从 0 到 1 的值?

例子:

public decimal GetSamplingError(decimal percent){

    decimal result = 0;

    result = 100*percent;

    return result;

}

是否可以控制参数百分比介于 0 和 1 之间?

感谢和抱歉我的英语不好。

4

5 回答 5

4

没有没有办法控制参数的范围,你可以做的是在函数本身内部控制它,并在函数中添加注释

public decimal GetSamplingError(decimal percent){

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

    return 100*percent;    
}

或者如果参数不在所需范围内,则提出一个in caseArgumentOutOfRangeException,但这取决于您希望如何管理应用程序的工作流。

于 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 的方法之外,当传递无效参数时,这将抛出异常。我更喜欢这种方法而不是仅仅改变百分比值,因为它实际上会让你注意到你传递了一个错误的值。

当您使用Code ContractsMicrosoft 时,您可以添加一个确保该值在特定范围内的合同。启用静态检查后,您将在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
}

当然,也可以创建自己的struct调用DecimalBetweenZeroAndOne,它是不可变的,并保存一个十进制字段,readonly您在其中编写检查以保证该字段的值始终在所需的范围内。

于 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 回答