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

C# コンパイラでは、#if ディレクティブ、次いで #endif ディレクティブが検出されると、これらのディレクティブ間のコードがコンパイルされます (指定されたシンボルが定義されている場合に限る)。When the C# compiler encounters an #if directive, followed eventually by an #endif directive, it compiles the code between the directives only if the specified symbol is defined. C および C++ とは異なり、シンボルに数値を割り当てることはできません。Unlike C and C++, you cannot assign a numeric value to a symbol. C# の #if ステートメントはブール値で、シンボルが定義されているかどうかのみをテストします。The #if statement in C# is Boolean and only tests whether the symbol has been defined or not. 次に例を示します。For example:

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

== (等しい) および != (等しくない) の各演算子は、truefalse のどちらであるかのテストにのみ使用できます。You can use the operators == (equality) and != (inequality) only to test for true or false. true は、シンボルが定義されていることを意味します。True means the symbol is defined. ステートメント #if DEBUG#if (DEBUG == true) の意味は同じです。The statement #if DEBUG has the same meaning as #if (DEBUG == true). && (かつ)、|| (または)、および !You can use the operators && (and), || (or), and ! (not) の各演算子を使用すると、複数のシンボルが定義されているかどうかを評価できます。(not) to evaluate whether multiple symbols have been defined. シンボルと演算子は、かっこを使用してグループ化できます。You can also group symbols and operators with parentheses.

解説Remarks

#if#else#elif#endif#define#undef の各ディレクティブを組み合わせると、1 つ以上のシンボルが存在するかどうかに応じてコードを含めたり除外したりできます。#if, along with the #else, #elif, #endif, #define, and #undef directives, lets you include or exclude code based on the existence of one or more symbols. これは、デバッグ ビルドのコードをコンパイルする場合や、特定の構成でコンパイルを行う場合に役立ちます。This can be useful when compiling code for a debug build or when compiling for a specific configuration.

#if ディレクティブで始まる条件付きディレクティブは、#endif ディレクティブで明示的に終了させる必要があります。A conditional directive beginning with a #if directive must explicitly be terminated with a #endif directive.

#define を使用するとシンボルを定義できます。#define lets you define a symbol. 定義したシンボルを #if ディレクティブに渡す式として使用すると、この式は true と評価されます。By then using the symbol as the expression passed to the #if directive, the expression evaluates to true.

シンボルは、-define コンパイラ オプションでも定義できます。You can also define a symbol with the -define compiler option. #undef を使うと、シンボルを未定義状態にできます。You can undefine a symbol with #undef.

-define または #define で定義されたシンボルは、同じ名前の変数とは競合しません。A symbol that you define with -define or with #define doesn't conflict with a variable of the same name. 変数名をプリプロセッサ ディレクティブに渡すことはできません。シンボルはプリプロセッサ ディレクティブだけで評価されます。That is, a variable name should not be passed to a preprocessor directive, and a symbol can only be evaluated by a preprocessor directive.

#define を使用して作成したシンボルのスコープは、そのシンボルが定義されているファイルです。The scope of a symbol created with #define is the file in which it was defined.

また、ビルド システムも、各種ターゲット フレームワークを表す、定義済みプリプロセッサ シンボルを認識します。The build system is also aware of predefined preprocessor symbols representing different target frameworks. これは、複数の .NET の実装やバージョンをターゲットとできるアプリケーションを作成する場合に役立ちます。They're useful when creating applications that can target more than one .NET implementation or version.

ターゲット フレームワークTarget Frameworks シンボルSymbols
.NET Framework.NET Framework NETFRAMEWORK, NET20, NET35, NET40, NET45, NET451, NET452, NET46, NET461, NET462, NET47, NET471, NET472, NET48NETFRAMEWORK, NET20, NET35, NET40, NET45, NET451, NET452, NET46, NET461, NET462, NET47, NET471, NET472, NET48
.NET Standard.NET Standard NETSTANDARD, NETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0NETSTANDARD, NETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0
.NET Core.NET Core NETCOREAPP, NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1, NETCOREAPP2_2NETCOREAPP, NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1, NETCOREAPP2_2

他の定義済みシンボルとしては、DEBUG 定数と TRACE 定数があります。Other predefined symbols include the DEBUG and TRACE constants. #define を使用して、プロジェクトに設定された値をオーバーライドできます。You can override the values set for the project using #define. たとえば、DEBUG シンボルは、ビルド構成プロパティ ("デバッグ" モードまたは "リリース" モード) に応じて自動的に設定されます。The DEBUG symbol, for example, is automatically set depending on your build configuration properties ("Debug" or "Release" mode).

使用例Examples

次の例は、ファイルで MYTEST シンボルを定義し、MYTEST シンボルと DEBUG シンボルの値をテストする方法を示しています。The following example shows you how to define a MYTEST symbol on a file and then test the values of the MYTEST and DEBUG symbols. この例の出力は、プロジェクトをデバッグとリリースのどちらの構成モードでビルドするかによって異なります。The output of this example depends on whether you built the project on Debug or Release configuration mode.

#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
    }
}

次の例は、各種ターゲット フレームワークをテストし、可能な場合には新しい API を使用できるようにする方法を示しています。The following example shows you how to test for different target frameworks so you can use newer APIs when possible:

public class MyClass
{
    static void Main()
    {
#if NET40
        WebClient _client = new WebClient();
#else
        HttpClient _client = new HttpClient();
#endif
    }
    //...
}

関連項目See also