0
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

这个构造函数的重点是初始化一个字段,而合约仅仅捕获了这个意图。合约的复杂性与其适用的代码相同。对我来说,这感觉是多余的,就好像我刚刚写了两次相同的代码(尽管从两个稍微不同的角度来看)。

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

4

1 回答 1

2

我的意见是肯定的。

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

于 2013-08-22T18:41:27.793 回答