#if (Referencia de C#)#if (C# Reference)

Cuando el compilador de C# encuentra una directiva #if, seguida finalmente por una directiva #endif, compila el código entre las directivas solo si se ha definido el símbolo especificado.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. A diferencia de C y C++, no se puede asignar un valor numérico a un símbolo.Unlike C and C++, you cannot assign a numeric value to a symbol. La instrucción #if en C# es booleana y solo comprueba si el símbolo se ha definido o no.The #if statement in C# is Boolean and only tests whether the symbol has been defined or not. Por ejemplo:For example:

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

Puede usar los operadores == (igualdad) y != (desigualdad) solo para comprobar los valores true o false.You can use the operators == (equality) and != (inequality) only to test for true or false. True significa que el símbolo está definido.True means the symbol is defined. La instrucción #if DEBUG tiene el mismo significado que #if (DEBUG == true).The statement #if DEBUG has the same meaning as #if (DEBUG == true). Puede usar los operadores && (y), || (o) y !You can use the operators && (and), || (or), and ! (no) para evaluar si se han definido varios símbolos.(not) to evaluate whether multiple symbols have been defined. Es posible agrupar símbolos y operadores mediante paréntesis.You can also group symbols and operators with parentheses.

ComentariosRemarks

#if, junto con las directivas #else, #elif, #endif, #define y #undef, permite incluir o excluir código basado en la existencia de uno o varios 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. Esto puede resultar útil al compilar código para una compilación de depuración o al compilar para una configuración específica.This can be useful when compiling code for a debug build or when compiling for a specific configuration.

Una directiva condicional que empieza con una directiva #if debe terminar de forma explícita con una directiva #endif.A conditional directive beginning with a #if directive must explicitly be terminated with a #endif directive.

#define permite definir un símbolo.#define lets you define a symbol. Si luego se usa el símbolo como la expresión pasada a la directiva #if, la expresión se evalúa como true.By then using the symbol as the expression passed to the #if directive, the expression evaluates to true.

También se puede definir un símbolo con la opción del compilador -define.You can also define a symbol with the -define compiler option. La definición de un símbolo se puede anular mediante #undef.You can undefine a symbol with #undef.

Un símbolo definido con -define o #define no debe entrar en conflicto con una variable del mismo nombre.A symbol that you define with -define or with #define doesn't conflict with a variable of the same name. Es decir, un nombre de variable no debe pasarse a una directiva de preprocesador y un símbolo solo puede ser evaluado por una directiva de preprocesador.That is, a variable name should not be passed to a preprocessor directive, and a symbol can only be evaluated by a preprocessor directive.

El ámbito de un símbolo creado con #define es el archivo en que se ha definido.The scope of a symbol created with #define is the file in which it was defined.

El sistema de compilación también tiene en cuenta los símbolos de preprocesador predefinidos que representan distintos marcos de destino.The build system is also aware of predefined preprocessor symbols representing different target frameworks. Resultan útiles al crear aplicaciones que pueden tener como destino más de una versión o implementación de .NET.They're useful when creating applications that can target more than one .NET implementation or version.

Versiones de .NET Framework 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
Núcleo de .NET.NET Core NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1

Otros símbolos predefinidos incluyen las constantes DEBUG y TRACE.Other predefined symbols include the DEBUG and TRACE constants. Puede invalidar los valores establecidos para el proyecto con #define.You can override the values set for the project using #define. Por ejemplo, el símbolo DEBUG se establece automáticamente según las propiedades de configuración de compilación (modo de "depuración" o de "versión").The DEBUG symbol, for example, is automatically set depending on your build configuration properties ("Debug" or "Release" mode).

EjemplosExamples

En el ejemplo siguiente se muestra cómo definir un símbolo MYTEST en un archivo y luego probar los valores de los símbolos MYTEST y 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. El resultado de este ejemplo depende de si ha compilado el proyecto en modo de configuración de depuración o de versión.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
    }
}

En el ejemplo siguiente se muestra cómo probar distintos marcos de destino para que se puedan usar las API más recientes cuando sea posible: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
    }
    //...
}

Vea tambiénSee also