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 { 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) 中添加 Contract 不变量:

[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 回答