わかりました、あなたの言いたいことがわかると思います。の代わりにプライベートメソッドという名前のケビンのAccountContracts
名前のようなクラスがあります:MyClassContract
ObjectInvariants
Invariants
[ContractClassFor(typeof(IAccount))]
public abstract class MyClassContract : IAccount
{
public abstract double Balance { get; }
void IAccount.Deposit(double amount)
{
Contract.Requires(amount >= 0.0d);
//throw new NotImplementedException();
}
bool IAccount.Withdraw(double amount)
{
Contract.Requires(amount >= 0.0d);
Contract.Requires(amount <= Balance);
throw new NotImplementedException();
}
[ContractInvariantMethod]
private void ObjectInvariants()
{
Contract.Invariant(Balance >= 0.0d);
}
}
FxCopy とコード分析は、コンパイル後の分析を行います。バイナリ、つまりビルドによって生成された中間言語 (IL) を分析します。Code Contracts は、抽象クラスから派生するだけでなく、メソッドを少なくとも 1 回MyClassContract
呼び出すバイナリにコードを生成するという点で、コンパイル後の織り方を行います。ObjectInvariants
コード コントラクトを「オフ」にすると、このコードが生成されなくなるため、FxCop とコード分析では、メソッドから派生したものやメソッドMyClassContract
を使用するものは何も表示されずObjectInvariants
、警告が表示されます。の場合MyClassContract
、そこから派生するものは何もないため、封印することができ (これにより、特定の状況下でコンパイラがわずかに最適化するのに役立ちます)、将来のクラスの保守が容易になります (何もできません)。から派生するため、より自由に変更できます-少なくともそれが一般的なコンセンサスです)。
もちろん、警告なしでコードをそのまま残したい場合は、抑制ファイルでこれらの警告を抑制することができます。また、コンパイラ定数を含めてコードを囲み、コード コントラクトを使用しないときにコンパイルを回避し、コード コントラクトを有効にするときにその定数をビルド設定に含めることもできます。例えば:
#if CODE_CONTRACTS
//...
#endif
CODE_CONTRACTS
コード コントラクトを有効にし、プロジェクトのビルド プロパティで宣言する特定のビルド構成を使用できるため、通常は新しいビルド構成を作成するのが最も簡単です。