.NET で自動的に実装されたプロパティにコントラクトを配置する方法はありますか? (そして、答えが「はい」の場合はどうですか)?
(DevLabs の .NET コード コントラクトを使用していると仮定します)
.NET で自動的に実装されたプロパティにコントラクトを配置する方法はありますか? (そして、答えが「はい」の場合はどうですか)?
(DevLabs の .NET コード コントラクトを使用していると仮定します)
はい、これは可能です。必要なのは、コントラクト条件を[ContractInvariantMethod]
クラスのメソッドに追加することだけです。これにより、同等のRequires
前提条件が自動set
ter に追加され、事後条件Ensures
が に追加されget
ます。リファレンスのセクション 2.3.1 から
例が示すように、自動プロパティの不変条件は次のようになります。
- セッターの前提条件
- ゲッターの事後条件
- 基になるバッキング フィールドの不変式
そして例によって:
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 );
...
私は考えていませんが、これを行うスニペットを簡単に書くことができます。このルートをたどる場合、タスクを非常に簡単にする無料のスニペットエディターがあります.
ありがとうポージェス。
私の間違いは、実際にReleaseRequires
オプションを使用したことでした。これは、実際には、メソッドのジェネリックバージョン のみを扱いRequires<T>
ます。
自動実装されたプロパティに置かれる不変は、実際には前提条件に変わり Requires
ますが、一般的ではありません。そのため、このオプションを使用しても機能しませんでした。
何をすべきか:
VARIANT 1.Requires<T>
自動実装されたプロパティの代わりに、コード スニペットと素敵なプロパティを使用することを検討してください。これにより、目的のタイプの例外を使用できるようになります。
VARIANT 2. Code Contracts のオプションでオプションをに変更し、 自動プロパティに不変条件を自由に記述してください。リライター ツールはそれらを自動的に に変更します。ただし、それらは一般的ではありません。つまり、契約が破られた場合、 aがスローされ、この動作を変更する方法はありません。ReleaseRequires
Preconditions
Requires
ContractException
助けてくれてありがとう!