Справочник по C#. #if#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. В отличие от С и С++ здесь нельзя назначить символу числовое значение.Unlike C and C++, you cannot assign a numeric value to a symbol. Оператор #if в C# является логическим. Он проверяет только одно условие — определен ли указанный символ.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

Операторы == (равенство) и != (неравенство) можно использовать только для проверки значений booltrue или false.You can use the operators == (equality) and != (inequality) only to test for the bool values 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 && (and), || (or), and ! (not) operators to evaluate whether multiple symbols have been defined. Можно также группировать символы и операторы при помощи скобок.You can also group symbols and operators with parentheses.

RemarksRemarks

#if, как и директивы #else, #elif, #endif, #define и #undef, позволяет включить или исключить код в зависимости от существования одного или нескольких символов.#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.

Система сборки также учитывает символы препроцессора, представляющие целевые платформы в проектах в стиле SDK.The build system is also aware of predefined preprocessor symbols representing different target frameworks in SDK-style projects. Они полезны при создании приложений, предназначенных для нескольких версий .NET.They're useful when creating applications that can target more than one .NET version.

Требуемые версии .NET FrameworkTarget Frameworks СимволыSymbols
.NET Framework.NET Framework NETFRAMEWORK, NET48, NET472, NET471, NET47, NET462, NET461, NET46, NET452, NET451, NET45, NET40, NET35, NET20NETFRAMEWORK, NET48, NET472, NET471, NET47, NET462, NET461, NET46, NET452, NET451, NET45, NET40, NET35, NET20
.NET Standard.NET Standard NETSTANDARD, NETSTANDARD2_1, NETSTANDARD2_0, NETSTANDARD1_6, NETSTANDARD1_5, NETSTANDARD1_4, NETSTANDARD1_3, NETSTANDARD1_2, NETSTANDARD1_1, NETSTANDARD1_0NETSTANDARD, NETSTANDARD2_1, NETSTANDARD2_0, NETSTANDARD1_6, NETSTANDARD1_5, NETSTANDARD1_4, NETSTANDARD1_3, NETSTANDARD1_2, NETSTANDARD1_1, NETSTANDARD1_0
.NET 5 (и .NET Core).NET 5 (and .NET Core) NET5_0, NETCOREAPP, NETCOREAPP3_1, NETCOREAPP3_0, NETCOREAPP2_2, NETCOREAPP2_1, NETCOREAPP2_0, NETCOREAPP1_1, NETCOREAPP1_0NET5_0, NETCOREAPP, NETCOREAPP3_1, NETCOREAPP3_0, NETCOREAPP2_2, NETCOREAPP2_1, NETCOREAPP2_0, NETCOREAPP1_1, NETCOREAPP1_0

Примечание

Для традиционных проектов, в которых не используется пакет SDK, необходимо вручную настроить символы условной компиляции для различных целевых платформ в Visual Studio с помощью страниц свойств проекта.For traditional, non-SDK-style projects, you have to manually configure the conditional compilation symbols for the different target frameworks in Visual Studio via the project's properties pages.

Другие предопределенные символы включают константы 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