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或者其他东西,那么框架对我来说是这样的,这样我就不必自己卷入我写的每个类中了,我认为这非常有用.
我可以返回一个异常,而不是默默地夹住值,但这不是很友好.
说什么?你是什么意思,"友好"?调用者不是你的朋友,它是另一段试图设置超出范围值的代码.应该立即告诉编写代码的开发人员他做错了什么.
抛出异常!
您可以使用代码合同进行静态合同检查(仅限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)
安装"合同"时,默认情况下不会打开静态检查器.您的项目属性将有一个额外的选项卡,您可以在其中配置合同选项并启用静态检查.
| 归档时间: |
|
| 查看次数: |
3598 次 |
| 最近记录: |