5

次のコードを試して、取得されたエンティティの null 以外のチェックを有効にして、具体的なビジネスを行う前にエンティティが存在することを確認しました。

protected T GetRequired<T>(object id)
    where T : EntityObject
{
    var obj = Get<T>(id);
    Contract.Requires<ArgumentNullException>(obj != null);
    return obj;
}

しかし、コンパイル時に私は得ています:
After contract block, found use of local variable 'obj' defined in contract block

Contract.Requiresは間違った方法で使用していますか?

4

2 に答える 2

6

Contract.Requiresは間違った方法で使用していますか?

はい、そうです。メソッド (またはプロパティ) の前提条件Contract.Requiresを記述することです。これらは、メソッド呼び出しを続行するために真でなければならない条件です。そうでない場合は、契約違反になります。

あなたのコードを見てみましょう:

var obj = Get<T>(id);
Contract.Requires<ArgumentNullException>(obj != null);

ここでは、メソッド (この場合はメソッド) の実行が終了した後に何かが true であることを確認するために使用しようとしています。それは事後条件であり、そのために の本体で使用します:GetContract.EnsuresGet

protected T Get<T>(object id) {
    Contract.Ensures(Contract.Results<T>() != null);
    // get and return result
}

最後に、このコンパイラ エラー

objコントラクト ブロックの後、コントラクト ブロックで定義されたローカル変数の使用を発見

Contractこのメッセージは、コントラクト ブロックの後に s を使用できず、コントラクト ブロックがメソッドの本体の先頭にのみ表示されるという事実の結果です。

于 2013-07-24T16:57:23.890 に答える