【发布时间】:2010-07-24 22:37:07
【问题描述】:
我想将构造函数中数字参数的值限制在一定范围内。
我知道常规方法是执行以下操作:
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; }
}
}
但我不喜欢的是调用者不知道何时将属性设置为指定以外的值。我可以返回一个异常而不是静默地限制值,但这不是很友好。
我想要的是类似于这样的东西:
public Foo(int(1, this.MaxAmount) amount) // Where int(minimumValue, maximumValue)
{
Amount = amount;
}
其中一个甚至无法用不可接受的值实例化 Foo - 框架会阻止它。
这样的事情可能吗?
为清晰而编辑:
我所追求的是参数本身可以携带和传达有关其约束的信息的一种方式 - 以“烘焙”方式,例如,在 Intellisense 中,当你写了电话。因此,如果参数的值无效,我什至会避免尝试实例化类的工作。
例如,如果程序正在运行并且用户键入一个数字 (N) 并按下一个按钮,该按钮创建了一个非法数量 N 的新 Foo,我现在有一个异常需要处理,并且有一些东西需要调试和修复.为什么甚至首先允许它?如果 Foo 已明确定义为其 Amount 属性的上限为 4,那么当我本可以通知他他传递的值在他传递的时候无效时,允许开发人员编写 Foo(5) 的意义何在?写的?
如果有一些语法糖,例如 ParameterConstraint 或其他东西,由框架为我处理,这样我就不必在我编写的每个类中都添加自己的语法糖,我认为这将非常有用。
【问题讨论】:
标签: c# .net parameters constructor