是否可以指定代码协定以确保方法不会更改对象的状态

时间:2011-12-04 11:18:53

标签: c# code-contracts

假设我的对象上有一个布尔IsValid属性。

我想创建一个方法,并确保在调用之后不会更改IsValid,无论是在调用之前它是真还是假。

是否支持此类事情?

4 个答案:

答案 0 :(得分:5)

为此,[Pure]属性已添加到System.Diagnostic.Contracts命名空间。有关详细说明,请参阅here。但是,您无法阻止更改单个属性。根本不允许该方法更改对象状态(如C ++ const)。

编辑:不幸的是,Pure属性不适用于当前工具。我使用以下代码实现了一个测试,在静态或运行时类型检查中都没有错误消息:

public class Test
{
    private int x = 0;

    [Pure]
    public void Foo()
    {
        x++;
    }
}

关于Pure支持的文件,将来会得到支持。无论什么时候(“代码合同团队正在努力工作,因此在未来版本中提出纯度检查器。”)。

我一直在使用该属性相信它正常工作。文档说明在合同中调用的所有方法都必须声明为纯。它没有说明是否检查过。

因此,您的问题的答案是:目前没有对此的支持,但可能在将来。

答案 1 :(得分:3)

我自己没有尝试过,但according to the MSDN Contract.OldValue可能有助于检查单个属性值是否未发生变化:

public bool IsValid
{
  get
  {
    ...
  }
}

public void SomeMethod()
{
  Contract.Ensures(this.IsValid == Contract.OldValue(this.IsValid));
  ...
}

答案 2 :(得分:1)

不,不幸的是,c#没有提供c ++这样的const逻辑。

答案 3 :(得分:1)

执行此操作的唯一方法是以您知道不会更改的方式控制代码。除此之外没有特定的代码或语法来控制它(如在C ++中)。