1

こんにちは、クラスのインターフェイスにコード コントラクトを配置しようとしています。次のようなものを書きます。

[ContractClass(typeof(MyClassContract))]
interface IMyClass
{
    int Id { get; set; }
}

[ContractClassFor(typeof(IMyClass))]
sealed class MyClassContract : IMyClass
{
    public int Id
    {
        get { return Id; }
        set { Contract.Requires(value > 0); }
    }
}

public class MyClass : IMyClass
{
    private int _id;
    public int Id
    {
        get { return _id; }
        set { _id = value; }
    }

}

しかし、決して使用されない get in contract を定義することを強制されるのは好きではありません。つまり、次のように記述できます。

get { return "abcdrdkldbfldsk"; }

書くことができないという理由だけで、内部クラスでパブリックプロパティを使用することを余儀なくされるのは好きではありません

get { return ImyClass.Id; } 

編集:これは私が書きたいものです:

[ContractClassFor(typeof(IMyClass))]
sealed class MyClassContract : IMyClass
{
    int IMyClass.Id
    {
        set { Contract.Requires(value > 0); }
    }
}
4

1 に答える 1

2

ContractClassFor( MyClassContract)にコントラクト不変条件を追加すると、次のようになります。

[ContractInvariantMethod]
private void ObjectInvariant ()
{
  Contract.Invariant (Id >= 0);
}

次に、プロパティの get / sets にEnsures/Requiresペアが追加されます。(参考文献の 2.3.1 を参照)

その後、自動プロパティを使用できますContractClassFor

int Id { get; set; }

(つまり、インターフェイスのため、プロパティを追加する必要があります)

詳細はこちら

于 2013-10-14T10:29:46.347 に答える