#if (Riferimenti per C#)#if (C# Reference)

Quando il compilatore C# trova una direttiva #if seguita da una direttiva #endif, compila il codice tra tali direttive solo se il simbolo specificato è definito.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. Diversamente da C e C++, non è possibile assegnare un valore numerico a un simbolo.Unlike C and C++, you cannot assign a numeric value to a symbol. L'istruzione #if in C# è di tipo booleano e verifica solo se il simbolo è stato definito o meno.The #if statement in C# is Boolean and only tests whether the symbol has been defined or not. Esempio:For example:

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

È possibile usare gli operatori == (uguaglianza) e != (disuguaglianza) solo per verificare se una condizione è true o false.You can use the operators == (equality) and != (inequality) only to test for true or false. True significa che il simbolo è definito.True means the symbol is defined. L'istruzione #if DEBUG ha lo stesso significato di #if (DEBUG == true).The statement #if DEBUG has the same meaning as #if (DEBUG == true). È possibile usare gli operatori && (and), || (or) e !You can use the operators && (and), || (or), and ! (not) per stabilire se sono stati definiti più simboli.(not) to evaluate whether multiple symbols have been defined. È anche possibile raggruppare simboli e operatori tra parentesi.You can also group symbols and operators with parentheses.

NoteRemarks

#if, nsieme alle direttive #else, #elif, #endif, #define e #undef, consente di includere o escludere il codice in base all'esistenza di uno o più simboli.#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. Questo può essere utile quando si compila il codice per una build di debug o per una configurazione specifica.This can be useful when compiling code for a debug build or when compiling for a specific configuration.

Una direttiva condizionale che inizia con #if deve terminare in modo esplicito con una direttiva #endif.A conditional directive beginning with a #if directive must explicitly be terminated with a #endif directive.

#define consente di definire un simbolo.#define lets you define a symbol. Usando poi il simbolo come espressione passata alla direttiva #if, l'espressione restituisce true.By then using the symbol as the expression passed to the #if directive, the expression evaluates to true.

Un simbolo può anche essere definito tramite l'opzione del compilatore -define.You can also define a symbol with the -define compiler option. Per rimuovere la definizione di un simbolo, è possibile usare #undef.You can undefine a symbol with #undef.

Un simbolo definito tramite -define o #define non provoca conflitti con una variabile avente lo stesso nome.A symbol that you define with -define or with #define doesn't conflict with a variable of the same name. Il nome di una variabile, infatti, non può essere passato a una direttiva del preprocessore e un simbolo può essere valutato solo da una direttiva del preprocessore.That is, a variable name should not be passed to a preprocessor directive, and a symbol can only be evaluated by a preprocessor directive.

L'ambito di un simbolo creato con #define è il file in cui è stato definito.The scope of a symbol created with #define is the file in which it was defined.

Il sistema di compilazione è inoltre in grado di riconoscere i simboli predefiniti del preprocessore che rappresentano i diversi Framework di destinazione nei progetti in stile SDK.The build system is also aware of predefined preprocessor symbols representing different target frameworks in SDK-style projects. Questi simboli sono utili durante la creazione di applicazioni destinata a più di un'implementazione o versione di .NET.They're useful when creating applications that can target more than one .NET implementation or version.

Framework di destinazioneTarget Frameworks SimboliSymbols
.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_0, NETSTANDARD2_1NETSTANDARD, NETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0, NETSTANDARD2_1
.NET Core.NET Core NETCOREAPP, NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1, NETCOREAPP2_2, NETCOREAPP3_0NETCOREAPP, NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1, NETCOREAPP2_2, NETCOREAPP3_0

Nota

Per i progetti di .NET Framework tradizionali, è necessario configurare manualmente i simboli di compilazione condizionale per i diversi framework di destinazione in Visual Studio tramite le pagine delle proprietà del progetto.For traditional .NET Framework projects, you have to manually configure the conditional compilation symbols for the different target frameworks in Visual Studio via the project's properties pages.

Altri simboli predefiniti includono le costanti DEBUG e TRACE.Other predefined symbols include the DEBUG and TRACE constants. È possibile sostituire i valori impostati per il progetto con #define.You can override the values set for the project using #define. Il simbolo DEBUG, ad esempio, viene impostato automaticamente a seconda delle proprietà di configurazione della build (modalità "Debug" o "Versione").The DEBUG symbol, for example, is automatically set depending on your build configuration properties ("Debug" or "Release" mode).

EsempiExamples

L'esempio seguente illustra come definire un simbolo MYTEST su un file e quindi testare i valori dei simboli 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. L'output di questo esempio dipende dal fatto che il progetto sia stato compilato con la modalità di configurazione Debug o Versione.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
    }
}

L'esempio seguente illustra come eseguire test per framework di destinazione diversi, in modo da poter usare le API più recenti quando possibile: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
    }
    //...
}

Vedere ancheSee also