我最近看过这个视频 关于托管合同工具库的http://channel9.msdn.com/pdc2008/TL51/当然看起来非常有趣。可悲的是,似乎他们不会将这种情况包含在语言本身中,这本身就像Spec#中那样更优雅。将C#4.0作为两个选项实际上是很好的,因为合同会给业务代码增加很多噪音。
有人在这里使用它并有一些现实世界的反馈吗?你还可以将合同添加到类属性甚至变量吗?像
这样的东西decimal Percentage (min 0, max 1)
string NotNullString (not null, regex("??"))
可能会很好。
答案 0 :(得分:2)
我正在尝试,但我认为该库太年轻,无法在大型项目中使用,至少在启用静态检查时:编译速度非常慢,并且具体的警告不是很清楚。
运行时检查可以毫无问题地使用,因为它们似乎是作为Debug.Assert实现的。至少你记录方法。
为了向属性添加契约,我会向set属性添加约束,但在这种特定情况下,我认为编写一个可以实际封装需求的类会更好,只允许构造好的对象。无论如何:
private decimal _Percentage;
decimal Percentage
{
get{ return _Percentage;}
set
{
CodeContract.RequiresAlways(value <= 1);
CodeContract.RequiresAlways(value >= 0);
_Percentage = value;
}
}
p.s:在我看来,C#的趋势是在动态打字方向,而不是采用严格和强大的打字编码方法。我认为DbC在强类型方面效果更好,至少因为它可以为类型和函数添加更多要求。
答案 1 :(得分:0)
似乎合同库可能非常适合Linq2Sql。在sql数据库中定义字段和约束,可以为您生成合同。这可能是对合同的一个很好的介绍。