假设我的对象上有一个布尔IsValid
属性。
我想创建一个方法,并确保在调用之后不会更改IsValid,无论是在调用之前它是真还是假。
是否支持此类事情?
答案 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 ++中)。