是否有可能指定代码契约以确保方法不会改变对象的状态?

本文关键字:改变 对象 状态 方法 确保 有可能 代码 契约 是否 | 更新日期: 2023-09-27 18:16:41

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

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

是否支持这样的事情?

是否有可能指定代码契约以确保方法不会改变对象的状态?

为此,[Pure]属性被添加到System.Diagnostic.Contracts命名空间中。请参阅此处了解进一步的解释。但是,您无法阻止单个属性被更改。该方法根本不允许改变对象的状态(像c++的const)。

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

public class Test
{
    private int x = 0;
    [Pure]
    public void Foo()
    {
        x++;
    }
}

关于纯检查的文档将在"将来"得到支持。无论何时("Code Contracts团队正在为此进行大量工作,以便在未来的版本中提出纯度检查器。")。

我一直在使用这个属性,相信它能正常工作。文档中说,在合约中调用的所有方法都必须声明为纯方法。它没有说明是否选中了

所以你的问题的答案是:目前不支持这个,但将来可能会支持。

我自己没有尝试过,但根据MSDN Contract.OldValue可能有助于检查单个属性值是否未更改:

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

不,遗憾的是c#没有像c++那样提供const逻辑。

做到这一点的唯一方法是以一种您知道它不会改变的方式来控制您的代码。没有特定的代码或语法来控制它,否则(如在c++中)。