#if (référence C#)#if (C# Reference)

Quand le compilateur C# rencontre une directive #if, suivie éventuellement d’une directive #endif, il compile le code entre les directives uniquement si le symbole spécifié est défini.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. Contrairement à C et C++, vous ne pouvez pas attribuer de valeur numérique à un symbole.Unlike C and C++, you cannot assign a numeric value to a symbol. L’instruction #if en C# est booléenne et teste uniquement si le symbole a été défini ou non.The #if statement in C# is Boolean and only tests whether the symbol has been defined or not. Exemple :For example:

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

Vous pouvez utiliser les opérateurs == (égalité) et != (inégalité) uniquement pour tester la valeur true ou false.You can use the operators == (equality) and != (inequality) only to test for true or false. True signifie que le symbole est défini.True means the symbol is defined. L’instruction #if DEBUG a la même signification que #if (DEBUG == true).The statement #if DEBUG has the same meaning as #if (DEBUG == true). Vous pouvez utiliser les opérateurs && (et), || (or) et !You can use the operators && (and), || (or), and ! (not) pour vérifier si plusieurs symboles ont été définis.(not) to evaluate whether multiple symbols have been defined. Vous pouvez également regrouper des symboles et des opérateurs à l’aide de parenthèses.You can also group symbols and operators with parentheses.

NotesRemarks

#if, ainsi que les directives #else, #elif, #endif, #define et #undef, vous permettent d’inclure ou d’exclure du code en fonction de l’existence d’un ou plusieurs symboles.#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. Cela peut être utile lors de la compilation du code pour une version Debug ou lors de la compilation d’une configuration spécifique.This can be useful when compiling code for a debug build or when compiling for a specific configuration.

Une directive conditionnelle commençant par une directive #if doit se terminer explicitement par une directive #endif.A conditional directive beginning with a #if directive must explicitly be terminated with a #endif directive.

#define vous permet de définir un symbole.#define lets you define a symbol. En utilisant ensuite ce dernier comme expression passée à la directive #if, l’expression correspond à true.By then using the symbol as the expression passed to the #if directive, the expression evaluates to true.

Vous pouvez aussi définir un symbole avec l’option du compilateur -define.You can also define a symbol with the -define compiler option. Vous pouvez annuler la définition d’un symbole avec #undef.You can undefine a symbol with #undef.

Un symbole que vous définissez avec -define ou #define n’est pas en conflit avec une variable du même nom.A symbol that you define with -define or with #define doesn't conflict with a variable of the same name. Autrement dit, un nom de variable ne doit pas être passé à une directive de préprocesseur, et un symbole ne peut être évalué que par une directive de préprocesseur.That is, a variable name should not be passed to a preprocessor directive, and a symbol can only be evaluated by a preprocessor directive.

La portée d’un symbole créé avec #define est le fichier dans lequel il a été défini.The scope of a symbol created with #define is the file in which it was defined.

Le système de génération tient également compte des symboles de préprocesseur prédéfinis représentant différents frameworks cibles.The build system is also aware of predefined preprocessor symbols representing different target frameworks. Ils sont utiles durant la création d’applications pouvant cibler plusieurs versions ou implémentations de .NET.They're useful when creating applications that can target more than one .NET implementation or version.

Versions cibles de .NET FrameworkTarget Frameworks SymbolesSymbols
.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

Parmi les autres symboles prédéfinis se trouvent les constantes DEBUG et TRACE.Other predefined symbols include the DEBUG and TRACE constants. Vous pouvez remplacer les valeurs définies pour le projet à l’aide de #define.You can override the values set for the project using #define. Le symbole DEBUG, par exemple, est automatiquement défini en fonction de vos propriétés de configuration de build (mode « Debug » ou « Release »).The DEBUG symbol, for example, is automatically set depending on your build configuration properties ("Debug" or "Release" mode).

ExemplesExamples

L’exemple suivant montre comment définir un symbole MYTEST sur un fichier, puis tester les valeurs des symboles MYTEST et 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. La sortie de cet exemple dépend du mode de configuration que vous avez utilisé pour créer le projet (Debug ou Release).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’exemple suivant montre comment tester différents frameworks cibles pour pouvoir utiliser les nouvelles API dans la mesure du possible :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
    }
    //...
}

Voir aussiSee also