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

このコンストラクターのポイントはフィールドを初期化することであり、コントラクトはその意図をキャプチャするだけです。コントラクトは、それが適用されるコードと同じ複雑さを持っています。私には、同じコードを 2 回 (わずかに異なる 2 つの視点からではありますが) 書いたかのように冗長に感じます。

この種の「マイクロコントラクト」はまったく必要ですか、それともコードコントラクトはメソッド本体からこれらを推測しますか?

4

1 に答える 1

2

私の意見はイエスです。

実装からコントラクトを推測する場合、実装を変更するとコントラクトが変更される可能性があります。これは、バージョン 1.0.0 でインターフェイスをリリースし、単純なバグ修正のために 1.0.1 で重大な変更を行うようなものです。あなたが私にそれを保証し、私X = xがあなたのコードのユーザーであることを確認したら、あなたが約束を守ってくれることを願っています. たとえば、コントラクト アセンブリは、NuGet パッケージ内のライブラリと共に配布することもできることに注意してください。

于 2013-08-22T18:41:27.793 に答える