0

パターンと思われる複数のケースにヒットしました:

Contract.Ensures(Contract.Result<BlahType>() != null);
...
BlahType Blah = new BlahType();
...
...
return Blah;

そしてそれは不満です。

いずれの場合も、フィールドはプライベートであり、メソッド内でそれを台無しにするものは何もありません。(データはディスクから取得する必要があるため、これらはすべて遅延初期化です。)

もちろん、ここに Contract.Assume を追加することもできますが、そのような答えは好きではありません。

4

1 に答える 1

0

フィールドが決してnull(または他の条件)ではないことを静的チェッカーに納得させる唯一の方法は、それを不変にすることです。不変メソッドの不変条件は、クラス内のすべてのメソッドの戻り時にチェックされるため、チェッカーはそれらが保持されていると見なす場合があります。したがって、クラスの一番下に追加します。

#region Invariants
[ContractInvariantMethod]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
    "CA1822:MarkMembersAsStatic",
    Justification = "Required for code contracts.")]
private void ObjectInvariant()
{
    Contract.Invariant(this.blah != null);
}
#endregion

ノート:

  • 不変メソッドは、属性が適用されてprivate voidいる引数のないメソッドです。ContractInvariantMethodそこに複数の不変条件を入れることができます。
  • ObjectInvariantメソッドスニペットをすばやく取得するには、と入力しcimTABTABます。
  • その他のコードコントラクトスニペットはここにあります。
  • C#では、プライベート/保護されたフィールドとローカル変数は、識別子の最初の文字を小文字(キャメルケース)で記述します。詳細については、こちらをご覧ください。これにより、コードがより読みやすく、理解しやすくなります。
于 2012-07-27T10:58:56.350 に答える