使用Code Contracts,我是否需要通过`Ensures`验证字段/属性初始化?

时间:2013-08-16 13:18:47

标签: c# code-contracts

using System.Diagnostics.Contracts;

class C
{
    public C(bool x)
    {
        Contract.Ensures(this.X == x);  // is this necessary?
        this.X = x;
    }

    public readonly bool X;  // could be a property instead,
}                            // I'm just trying to keep this example simple

这个构造函数的要点是初始化一个字段,而契约只是捕获了那个意图。合同与其适用的代码具有相同的复杂性。对我来说,感觉多余,好像我刚刚编写了两次相同的代码(虽然两个略有不同的视角)。

这种“微合同”是否必要,或者代码合同是否从方法体中推断出来?

1 个答案:

答案 0 :(得分:2)

我的意见是肯定的。

如果您从实施中推断合同,则对您的实施的任何更改都可能会更改合同。这就像在版本1.0.0中发布一个接口并在1.0.1中对其进行重大更改由于一个简单的错误修复。当您向我保证X = x并且我是您的代码的用户时,我希望您信守诺言。请记住,合同装配也可以与NuGet包中的库一起分发。