自动实现的属性的代码合同

时间:2011-04-01 13:19:32

标签: c# .net properties code-contracts automatic-properties

有没有办法将合同放在.NET中自动实现的属性上? (如果答案是“是”,那该怎么办?)

(我假设使用DevLabs的.NET代码合同)

3 个答案:

答案 0 :(得分:16)

是的,这是可能的 - 只需将合同条件添加到班级中的[ContractInvariantMethod]方法,然后将等效的Requires前置条件添加到自动set之后,Ensures添加了帖子条件get。来自Reference

的第2.3.1节
  

如示例所示,自动属性的不变量变为:

     
      
  1. setter的先决条件
  2.   
  3. getter的后置条件
  4.   
  5. 底层支持字段的不变量
  6.   

以示例:

public int MyProperty { get; private set ;}

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

“相当于以下代码:”

private int backingFieldForMyProperty;
public int MyProperty 
{
  get 
  {
    Contract.Ensures(Contract.Result<int>() >= 0);
    return this.backingFieldForMyProperty;
  }

  private set 
  {
    Contract.Requires(value >= 0);
    this.backingFieldForMyProperty = value;
  }
}

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

答案 1 :(得分:1)

我想不是,但你可以轻松编写一个可以执行此操作的代码段。如果你走这条路线,here is a free snippet editor将使任务变得非常容易。

答案 2 :(得分:1)

感谢Porges。

我的错误是我实际上使用了ReleaseRequires选项,实际上只处理方法的{strong>泛型版本Requires<T>

置于自动实现的属性上的不变量确实变成了 Requires前提条件,但它不是通用的 - 这就是为什么它不能使用此选项。

怎么做:

  • VARIANT 1.考虑使用代码片段和可爱的Requires<T>代替自动实现的属性 - 这使我们能够使用所需类型的异常。

  • VARIANT 2. 在“代码合同”选项中将选项 ReleaseRequires更改为Preconditions,并随意在自动属性上写入不变量 - 重写器工具会自动将它们更改为Requires。但是,它们将是非泛型的 - 这意味着,如果合同被破坏,将抛出ContractException,并且无法改变此行为。

感谢大家的帮助!