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
这个构造函数的要点是初始化一个字段,而契约只是捕获了那个意图。合同与其适用的代码具有相同的复杂性。对我来说,感觉多余,好像我刚刚编写了两次相同的代码(虽然两个略有不同的视角)。
这种“微合同”是否必要,或者代码合同是否从方法体中推断出来?
答案 0 :(得分:2)
我的意见是肯定的。
如果您从实施中推断合同,则对您的实施的任何更改都可能会更改合同。这就像在版本1.0.0中发布一个接口并在1.0.1中对其进行重大更改由于一个简单的错误修复。当您向我保证X = x
并且我是您的代码的用户时,我希望您信守诺言。请记住,合同装配也可以与NuGet包中的库一起分发。