1

我最近看到了这个视频 http://channel9.msdn.com/pdc2008/TL51/关于托管合同工具库,这看起来非常有趣。可悲的是,他们似乎不会将其包含在语言本身中,这会像 Spec# 中那样更优雅。事实上,在 C#4.0 中拥有这两个选项会很好,因为合同给业务代码增加了很多噪音。

这里有人用过它并有一些真实世界的反馈吗?您还可以将合同添加到类属性甚至变量吗?就像是

decimal Percentage (min 0, max 1)
string NotNullString (not null, regex("??"))

也许会很好。

4

2 回答 2

2

我正在尝试,但我认为该库还太年轻,无法在大型项目中认真使用,至少在启用静态检查的情况下:编译非常慢,具体的警告不是很清楚阅读。

运行时检查可以毫无问题地使用,因为它们似乎是作为 Debug.Assert 实现的。至少你记录方法。

为了向属性添加契约,我会向 set 属性添加约束,但在这种特定情况下,我认为编写一个可以实际封装需求的类会更好,只允许构造好的对象。反正:

    private decimal _Percentage;
    decimal Percentage
    {
        get{ return _Percentage;}
        set
        {
            CodeContract.RequiresAlways(value <= 1);
            CodeContract.RequiresAlways(value >= 0);
            _Percentage = value;
        }
    }

ps:在我看来,C# 的趋势是朝着动态类型方向发展,而不是走向严格和强类型的编码方法。我认为DbC更适合强类型,至少因为它允许您向类型和函数添加更多要求。

于 2009-01-30T15:15:25.693 回答
0

合同库似乎很适合 Linq2Sql。在您的 sql 数据库中定义字段和约束,并且可以为您生成合同。这可能是对合同的一个很好的介绍。

于 2009-01-30T18:20:59.767 回答