#if (C# リファレンス)
#if ディレクティブとその後にある #endif ディレクティブが C# コンパイラによって検出されると、これらのディレクティブ間のコードは、指定のシンボルが定義されている場合にのみコンパイルされます。 C および C++ とは異なり、シンボルに数値を割り当てることはできません。C# の #if ステートメントはブール型であり、シンボルが定義されているかどうかのみをテストします。 次に例を示します。
#define DEBUG
// ...
#if DEBUG
Console.WriteLine("Debug version");
#endif
true か false かをテストするときには、== (等値) と != (非等値) の演算子のみを使用できます。 true はシンボルが定義されていることを意味します。 #if DEBUG ステートメントは #if (DEBUG == true) と同じ意味です。 演算子を使用 && は、(または)、|| (または)、および !(ではなく) 複数のシンボルが定義されているかどうかを評価します。 シンボルと演算子は、かっこを使用してグループ化できます。
解説
#if を、#else、#elif、#endif、#define、および #undef ディレクティブと組み合わせて使用すると、1 つ以上のシンボルの存在に応じて、コードを処理対象にしたり、処理対象から外したりできます。 これは、デバッグ ビルド用にコンパイルするときや、特定の構成でコンパイルするときに使用すると便利です。
#if で始まる条件付きディレクティブは、#endif ディレクティブで明示的に終了する必要があります。
#define を使用すると、シンボルを定義できます。定義したシンボルを式として #if ディレクティブに渡すと、式は true と評価されます。
また、シンボルは /define コンパイラ オプションでも定義できます。 #undef を使うと、シンボルを未定義状態にできます。
/define または #define で定義されたシンボルは、同じ名前の変数とは競合しません。 変数名をプリプロセッサ ディレクティブに渡すことはできません。シンボルはプリプロセッサ ディレクティブだけで評価されます。
#define で定義されたシンボルのスコープは、シンボルが定義されたファイル内だけです。
使用例
// preprocessor_if.cs
#define DEBUG
#define MYTEST
using System;
public class MyClass
{
static void Main()
{
#if (DEBUG && !MYTEST)
Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && MYTEST)
Console.WriteLine("MYTEST is defined");
#elif (DEBUG && MYTEST)
Console.WriteLine("DEBUG and MYTEST are defined");
#else
Console.WriteLine("DEBUG and MYTEST are not defined");
#endif
}
}