2

constコード コントラクトを使用して、C++メソッドやすべてのメンバーを に設定するのと同様に、メソッドがオブジェクトのメンバーを変更しないことを確認/確認する方法はあります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

4

2 に答える 2

2

したがって、本質的に、メソッドが であることを確認する必要がありPureます。公式ドキュメントには、まだサポートされていないことが示されています (セクション 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.
于 2012-11-21T10:40:49.377 に答える
0

クラスが実装する場合

ICloneable

IEquatable<YourClassType>

値の等価性 (参照の等価性ではない) として、次のように記述できます。

Contract.Ensures( 
    this.Equals ( Contract.OldValue ( (YourClassType)this.Clone() )
);
于 2013-12-09T09:20:05.057 に答える