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

Val*_*zub 6 c# code-contracts

可以说IsValid我的对象上有一个布尔属性.

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

这样的事情有支持吗?

slf*_*fan 5

为此,[Pure]属性已添加到System.Diagnostic.Contracts命名空间.请参阅此处以获得进一步说 但是,您无法阻止更改单个属性.根本不允许该方法更改对象状态(如C++ const).

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

public class Test
{
    private int x = 0;

    [Pure]
    public void Foo()
    {
        x++;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

所以你的问题的答案是:目前没有这方面的支持,但可能在将来.

  • 我即将提出相同的建议,但决定检查msdn.有一点让我担心:"当前的分析工具不强制执行此属性;只有在确定方法是纯粹的时才应使用此属性." 在http://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.pureattribute.aspx.我会快速检查是否有问题. (4认同)

Pav*_*lov 3

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

public bool IsValid
{
  get
  {
    ...
  }
}

public void SomeMethod()
{
  Contract.Ensures(this.IsValid == Contract.OldValue(this.IsValid));
  ...
}
Run Code Online (Sandbox Code Playgroud)