#if (Referência de C#)#if (C# Reference)

Quando o Compilador do Visual C# encontra uma diretiva #if, seguida eventualmente por uma diretiva #endif, ele compila o código entre as diretivas somente quando o símbolo especificado é definido.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. Ao contrário do C e do C++, não é possível atribuir um valor numérico a um símbolo.Unlike C and C++, you cannot assign a numeric value to a symbol. A instrução #if em C# é booliana e testa apenas quando o símbolo foi definido ou não.The #if statement in C# is Boolean and only tests whether the symbol has been defined or not. Por exemplo:For example:

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

É possível usar os operadores == (igualdade) e != (desigualdade) apenas para testar true ou false.You can use the operators == (equality) and != (inequality) only to test for true or false. True significa que o símbolo foi definido.True means the symbol is defined. A instrução #if DEBUG tem o mesmo significado que #if (DEBUG == true).The statement #if DEBUG has the same meaning as #if (DEBUG == true). É possível usar os operadores && (e), || (ou) e !You can use the operators && (and), || (or), and ! (não) para avaliar se vários símbolos foram definidos.(not) to evaluate whether multiple symbols have been defined. Também é possível agrupar os símbolos e operadores com parênteses.You can also group symbols and operators with parentheses.

ComentáriosRemarks

#if, juntamente com as diretivas #else, #elif, #endif, #define e #undef, permite incluir ou excluir código com base na existência de um ou mais símbolos.#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. Isso pode ser útil ao compilar o código para um build de depuração ou ao compilar para uma configuração específica.This can be useful when compiling code for a debug build or when compiling for a specific configuration.

Uma diretiva condicional que começa com uma diretiva #if deverá ser explicitamente encerrada com uma diretiva #endif.A conditional directive beginning with a #if directive must explicitly be terminated with a #endif directive.

A diretiva #define permite definir um símbolo.#define lets you define a symbol. Ao usar o símbolo como a expressão passada para a diretiva #if, a expressão será avaliada como true.By then using the symbol as the expression passed to the #if directive, the expression evaluates to true.

Você também pode definir um símbolo com a opção do compilador -define.You can also define a symbol with the -define compiler option. É possível excluir um símbolo com #undef.You can undefine a symbol with #undef.

Um símbolo definido com -define ou com #define não entra em conflito com uma variável do mesmo nome.A symbol that you define with -define or with #define doesn't conflict with a variable of the same name. Ou seja, um nome de variável não deve ser passado para uma diretiva de pré-processamento e um símbolo pode ser avaliado apenas por uma diretiva de pré-processamento.That is, a variable name should not be passed to a preprocessor directive, and a symbol can only be evaluated by a preprocessor directive.

O escopo de um símbolo criado com #define é o arquivo no qual ele foi definido.The scope of a symbol created with #define is the file in which it was defined.

O sistema de build também está ciente dos símbolos de pré-processamento predefinidos que representam várias estruturas de destino.The build system is also aware of predefined preprocessor symbols representing different target frameworks. Eles são úteis ao criar aplicativos que podem direcionar mais de uma implementação ou versão do .NET.They're useful when creating applications that can target more than one .NET implementation or version.

Frameworks de destinoTarget Frameworks SímbolosSymbols
.NET Framework.NET Framework NET20, NET35, NET40, NET45, NET451, NET452, NET46, NET461, NET462, NET47, NET471, NET472NET20, NET35, NET40, NET45, NET451, NET452, NET46, NET461, NET462, NET47, NET471, NET472
.NET Standard.NET Standard NETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0NETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0
.NET Core.NET Core NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1, NETCOREAPP2_2NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1, NETCOREAPP2_2

As constantes TRACE e DEBUG são exemplos de outros símbolos predefinidos.Other predefined symbols include the DEBUG and TRACE constants. Para substituir os valores definidos no projeto, use a diretiva #define.You can override the values set for the project using #define. Por exemplo, o símbolo DEBUG é definido automaticamente, de acordo com as propriedades de configuração do build (Modo de Depuração ou Modo de Versão).The DEBUG symbol, for example, is automatically set depending on your build configuration properties ("Debug" or "Release" mode).

ExemplosExamples

O exemplo a seguir mostra como definir um símbolo MYTEST em um arquivo e testar os valores dos símbolos MYTEST e 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. A saída deste exemplo depende do fato de você criar o projeto no modo de configuração de versão ou no modo de configuração de depuração.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
    }
}

O exemplo a seguir mostra como testar várias estruturas de destino para que você possa usar APIs mais recentes, quando possível: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
    }
    //...
}

Consulte tambémSee also