#if (C# リファレンス)

#if ディレクティブとその後にある #endif ディレクティブが C# コンパイラによって検出されると、これらのディレクティブ間のコードは、指定のシンボルが定義されている場合にのみコンパイルされます。 C および C++ とは異なり、シンボルに数値を割り当てることはできません。C# の #if ステートメントはブール型であり、シンボルが定義されているかどうかのみをテストします。 次に例を示します。

#define DEBUG
// ...
#if DEBUG
    Console.WriteLine("Debug version");
#endif

truefalse かをテストするときには、== (等値) と != (非等値) の演算子のみを使用できます。 true はシンボルが定義されていることを意味します。 #if DEBUG ステートメントは #if (DEBUG == true) と同じ意味です。 複数のシンボルが定義されているかどうかを評価するときには、&& (AND) と || (OR) の演算子を使用できます。 シンボルと演算子は、かっこを使用してグループ化できます。

解説

#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
    }
}
  DEBUG and MYTEST are defined

参照

参照

C# プリプロセッサ ディレクティブ

概念

C# プログラミング ガイド

その他の技術情報

C# リファレンス