条件付きコンパイルはすべて、コンパイラのプリプロセッサ定義から駆動されます。これは定数に使用されるのと同じアプローチですが、DEBUG
Visual Studio はその定義をチェックボックスの後ろに隠します。これらのシンボルが定義されていない場合、メソッドはまったく呼び出されないため、これは効率的なアプローチです。重要なのは、渡されるパラメーターも評価されないため、コード コントラクトで比較的高価なチェックを使用できるため、これらのチェックがリリース ビルドの速度を低下させることを心配する必要がありません。
Microsoft の Code Contracts の紹介では、次のように述べています。
コントラクト クラスのほとんどのメソッドは条件付きでコンパイルされます。つまり、コンパイラは、#define ディレクティブを使用して特別なシンボル CONTRACTS_FULL を定義した場合にのみ、これらのメソッドを呼び出します。CONTRACTS_FULL を使用すると、#ifdef ディレクティブを使用せずにコードにコントラクトを記述できます。コントラクトのあるものとないもの、さまざまなビルドを作成できます。
#define
これは、コード内で使用してコード コントラクトをオンにすることについて説明していますが、次のようになります。
#define CONTRACTS_FULL
@NirMH がコメントで述べたように、通常はプロジェクトの条件付きコンパイル シンボルで定義することをお勧めします。これにより、一部のビルドではオンにし、他のビルドではオフにすることができます。
これが唯一のオプションであることに注意してくださいCONTRACTS_FULL
。ただし、将来、より詳細な制御が可能になるように明確に名前が付けられています。