15

基本的な質問があります。当たり前のことかもしれませんが、何らかの理由で Code Contracts のインストールと使用に成功していないようです。

MSDN からパッケージをダウンロードし、オンライン ドキュメントに従ってインストールしましたが、以下のコード ステートメントに対して IDE 警告が引き続き表示されます。

Contract.Requires(inputParameter != "");

IDE の警告は次のとおりです。

「メソッド呼び出しがスキップされました。メソッドが条件付きであるか、実装されていない部分メソッドであるため、コンパイラはメソッド呼び出しを生成しません」

Code Contracts を有効にするプロセスで不足しているものはありますか? VS2010 Ultimate SP1 を使用しています

4

2 に答える 2

12

これは、プロジェクト設定でコード コントラクトが構成されていないことが原因である可能性があります。プロジェクトのプロパティに移動すると、Code Contracts タブが表示されます。タブで、ビルドするモード (デバッグ | リリース | 両方) を選択し、適切なチェック ボックスをオンにしてコード コントラクト機能を有効にします。

Code Contracts が に設定されていない場合の詳細についての警告を見ましたBuild

[コード コントラクト] タブが表示されない場合は、マシンにコード コントラクトをインストールする必要がある可能性があります。これを行うには、ここからインストーラーをダウンロードしてインストールします

于 2012-12-19T08:59:59.027 に答える
5

条件付きコンパイルはすべて、コンパイラのプリプロセッサ定義から駆動されます。これは定数に使用されるのと同じアプローチですが、DEBUGVisual Studio はその定義をチェックボックスの後ろに隠します。これらのシンボルが定義されていない場合、メソッドはまったく呼び出されないため、これは効率的なアプローチです。重要なのは、渡されるパラメーターも評価されないため、コード コントラクトで比較的高価なチェックを使用できるため、これらのチェックがリリース ビルドの速度を低下させることを心配する必要がありません。

Microsoft の Code Contracts の紹介では、次のように述べています。

コントラクト クラスのほとんどのメソッドは条件付きでコンパイルされます。つまり、コンパイラは、#define ディレクティブを使用して特別なシンボル CONTRACTS_FULL を定義した場合にのみ、これらのメソッドを呼び出します。CONTRACTS_FULL を使用すると、#ifdef ディレクティブを使用せずにコードにコントラクトを記述できます。コントラクトのあるものとないもの、さまざまなビルドを作成できます。

#defineこれは、コード内で使用してコード コントラクトをオンにすることについて説明していますが、次のようになります。

#define CONTRACTS_FULL

@NirMH がコメントで述べたように、通常はプロジェクトの条件付きコンパイル シンボルで定義することをお勧めします。これにより、一部のビルドではオンにし、他のビルドではオフにすることができます。

条件付きコンパイルの設定

これが唯一のオプションであることに注意してくださいCONTRACTS_FULL。ただし、将来、より詳細な制御が可能になるように明確に名前が付けられています。

于 2016-01-30T09:22:52.347 に答える