C# 是否可以指定代码契约以确保方法不';不能改变对象的状态

C# 是否可以指定代码契约以确保方法不';不能改变对象的状态,c#,code-contracts,C#,Code Contracts,假设我的对象上有一个布尔IsValid属性 我想创建一个方法,并确保IsValid在调用后不被更改,无论它在调用前是true还是false 是否有这样的事情的支持?< P>不,不幸的是,C没有提供一个C++这样的const逻辑。 < P>唯一的方法就是控制你的代码,这样你就知道它不会改变。没有特定的代码或语法来控制它(如在C++中)。为此,已将[Pure]属性添加到名称空间中。有关详细说明,请参阅。但是,不能阻止更改单个属性。该方法根本不允许更改对象状态(如C++ const)。 编辑:很遗憾,

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

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


是否有这样的事情的支持?

< P>不,不幸的是,C没有提供一个C++这样的const逻辑。

< P>唯一的方法就是控制你的代码,这样你就知道它不会改变。没有特定的代码或语法来控制它(如在C++中)。

为此,已将[Pure]属性添加到名称空间中。有关详细说明,请参阅。但是,不能阻止更改单个属性。该方法根本不允许更改对象状态(如C++ const)。 编辑:很遗憾,纯属性不能与当前工具一起使用。我用以下代码实现了一个测试,无论是在静态还是在运行时类型检查都没有错误消息:

public class Test
{
    private int x = 0;

    [Pure]
    public void Foo()
    {
        x++;
    }
}
关于支票的文件记录,将在“将来”提供支持。无论何时(“代码契约团队正在对此进行大量工作,因此在未来的版本中会提出一个纯度检查器。”)

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


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

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

public bool IsValid
{
  get
  {
    ...
  }
}

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

我正要提出同样的建议,但决定查看msdn。有一件事让我担心:“当前的分析工具不强制使用此属性;只有在确定方法是纯的情况下,才应该使用此属性。”。我将快速检查它是否有问题。已确认-PureAttribute不会在应用于更改对象状态的方法的代码契约分析器中产生警告或错误。通过运行时和静态检查进行测试。所以没有办法在这个场景中使用代码契约这是一个有趣的观点,我也证实了这一点!因此,microsoft实现并记录了一个没有实际用途的属性。那太糟糕了,一定有什么目的吧?或者它刚刚宣布的功能还没有实现?听起来很奇怪。我刚检查了文档。它们似乎只与代码契约结合使用,并声明该方法没有明显的副作用。据说“将来”会有一个纯度检测仪。很伤心。。。