有没有办法使用代码约定来确保/检查方法不会更改对象的任何成员,类似于C ++ const
方法或将所有成员设置为readonly
?
即。比以下更简单的方法:
Contract.Ensures(this.member1 == Contract.OldValue(this.member1));
Contract.Ensures(this.member2 == Contract.OldValue(this.member2));
Contract.Ensures(this.member3 == Contract.OldValue(this.member3));
Contract.Ensures(this.member4 == Contract.OldValue(this.member4));
Contract.Ensures(this.member5 == Contract.OldValue(this.member5));
或使用Contract.EnsuresOnThrow
进行相同的操作。
答案 0 :(得分:2)
基本上你想检查方法是Pure
。 official documentation表示尚未支持(参见第5.4节):
5.4 Purity
All methods called within a contract must be pure: that is, they must not update
any pre-existing state. (A pure method is allowed to modify objects that have been
created after entry into the pure method.) Code Contract tools currently assume
the following things are pure:
* Methods marked [Pure] (If a type is marked [Pure], then that applies to all of
its methods.) The pure attribute is dened in the contract library. (Section 4.3)
* Property getters.
* Operators (static methods whose names start with op , have one or two parameters
and a non-void return type).
* Any method whose fully qualified name begins with
System.Diagnostics.Contracts.Contract, System.String, System.IO.Path, or
System.Type.
* Any invoked delegate, provided that the delegate type itself is attributed with
[Pure]. The existing delegate types System.Predicate<T> and System.Comparison<T>
are considered pure.
In the future, there will be a purity checker that will enforce these assumptions.
答案 1 :(得分:0)
如果你的班级实施
ICloneable
和
IEquatable<YourClassType>
作为值相等(不是引用相等),而不是你可以写:
Contract.Ensures(
this.Equals ( Contract.OldValue ( (YourClassType)this.Clone() )
);