13

.NET で自動的に実装されたプロパティにコントラクトを配置する方法はありますか? (そして、答えが「はい」の場合はどうですか)?

(DevLabs の .NET コード コントラクトを使用していると仮定します)

4

3 に答える 3

16

はい、これは可能です。必要なのは、コントラクト条件を[ContractInvariantMethod]クラスのメソッドに追加することだけです。これにより、同等のRequires前提条件が自動setter に追加され、事後条件Ensuresが に追加されgetます。リファレンスのセクション 2.3.1 から

例が示すように、自動プロパティの不変条件は次のようになります。

  1. セッターの前提条件
  2. ゲッターの事後条件
  3. 基になるバッキング フィールドの不変式

そして例によって:

public int MyProperty { get; private set ;}

[ContractInvariantMethod]
private void ObjectInvariant ()
{
  Contract.Invariant ( this.MyProperty >= 0 );
}

「次のコードと同等です:」

private int backingFieldForMyProperty;
public int MyProperty 
{
  get 
  {
    Contract.Ensures(Contract.Result<int>() >= 0);
    return this.backingFieldForMyProperty;
  }

  private set 
  {
    Contract.Requires(value >= 0);
    this.backingFieldForMyProperty = value;
  }
}

[ContractInvariantMethod]
private void ObjectInvariant () 
{
  Contract.Invariant ( this.backingFieldForMyProperty >= 0 );
...
于 2013-09-19T16:31:46.127 に答える
1

私は考えていませんが、これを行うスニペットを簡単に書くことができます。このルートをたどる場合、タスクを非常に簡単にする無料のスニペットエディターがあります.

于 2011-04-01T13:27:25.153 に答える
1

ありがとうポージェス。

私の間違いは、実際にReleaseRequiresオプションを使用したことでした。これは、実際には、メソッドのジェネリックバージョン のみを扱いRequires<T>ます。

自動実装されたプロパティに置かれる不変は、実際には前提条件に変わり Requiresますが、一般的ではありません。そのため、このオプションを使用しても機能しませんでした。

何をすべきか:

  • VARIANT 1.Requires<T>自動実装されたプロパティの代わりに、コード スニペットと素敵なプロパティを使用することを検討してください。これにより、目的のタイプの例外を使用できるようになります。

  • VARIANT 2. Code Contracts のオプションでオプションをに変更し、 自動プロパティに不変条件を自由に記述してください。リライター ツールはそれらを自動的に に変更します。ただし、それらは一般的ではありません。つまり、契約が破られた場合、 aがスローされ、この動作を変更する方法はありません。ReleaseRequiresPreconditionsRequiresContractException

助けてくれてありがとう!

于 2011-04-18T16:02:38.347 に答える