限制构造函数AT DESIGN TIME中参数的值

6 .net c# parameters constructor

我想将构造函数中的number参数的值限制在一定范围内.

我知道传统的方法是做类似以下的事情:

public class Foo
{
    public int MaxAmount { get; }
    public int Amount { get; set; }

    public Foo(int amount)
    {
        if (amount > MaxAmount) { Amount = MaxAmount; }
        else if (amount < 1) { Amount = 1; }
        else { Amount = amount; }
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不喜欢的是调用者不知道属性何时设置为指定的内容.我可以返回一个异常,而不是默默地夹住值,但这不是很友好.

我想要的是类似于此的东西:

public Foo(int(1, this.MaxAmount) amount) // Where int(minimumValue, maximumValue)
{
   Amount = amount;
}
Run Code Online (Sandbox Code Playgroud)

其中一个人甚至无法用不可接受的值来实例化Foo - 框架会阻止它.

有可能这样吗?

编辑清晰度:

我所追求的是一种方法,参数本身可以携带并传递有关其约束的信息 - 以"烘焙"的方式,例如,当您编写呼叫时可能在Intellisense中浮出水面.因此,如果参数的值无效,我甚至会避免尝试实例化类的工作.

例如,如果程序正在运行并且用户键入数字(N)并按下创建具有非法数量N的新Foo的按钮,那么我现在有一个例外来处理并调试和修复.为什么甚至首先允许它?如果Foo已被明确定义为其Amount属性的上限为4,那么当我可以告诉他他正在传递的值在他没有效时,允许开发人员编写Foo(5)是什么意思?写了吗?

如果有一些语法糖,比如ParameterConstraint或者其他东西,那么框架对我来说是这样的,这样我就不必自己卷入我写的每个类中了,我认为这非常有用.

Joh*_*ica 9

我可以返回一个异常,而不是默默地夹住值,但这不是很友好.

说什么?你是什​​么意思,"友好"?调用者不是你的朋友,它是另一段试图设置超出范围值的代码.应该立即告诉编写代码的开发人员他做错了什么.

抛出异常!

  • 我想“通知”调用者该值无效,但不执行尝试实例化该类的工作。我认为,如果能得到智能感知的回应,表明它无效,那就太好了。 (2认同)

Mar*_*k H 7

您可以使用代码合同进行静态合同检查(仅限Premium - 标准版仅提供运行时合同检查).

语法很简单

public Foo(int amount) {
    Contract.Requires(amount < MaxAmount);
    ...
 }
Run Code Online (Sandbox Code Playgroud)

(Requires)通过在调用方法时检查参数是否受约束来计算合同.在您的实例中,很难使用实例字段MaxAmount来评估构造函数参数,因为您无法事先检查该值.(使MaxValue静态以解决此问题).

这种电话的例子.

int val = _getFromSomewhere();
var foo = new Foo(val); 
//This May produce compile time error 
// because the contract checker cannot prove you contract is met.
Run Code Online (Sandbox Code Playgroud)

修复方法是确保将约束放在调用的位置.

int val = _getFromSomewhere();
if (val < Foo.MaxAmount)
    var foo = new Foo(val); 
    //Will always compile fine, because contract is met.
Run Code Online (Sandbox Code Playgroud)

安装"合同"时,默认情况下不会打开静态检查器.您的项目属性将有一个额外的选项卡,您可以在其中配置合同选项并启用静态检查.