Recherche…


Syntaxe

  • #define [symbole] // Définit un symbole de compilation.
  • #undef [symbole] // Annule un symbole du compilateur.
  • #warning [message d'avertissement] // Génère un avertissement de compilation. Utile avec #if.
  • # erreur [message d'erreur] // Génère une erreur de compilation. Utile avec #if.
  • #line [numéro de ligne] (nom du fichier) // Remplace le numéro de ligne du compilateur (et éventuellement le nom du fichier source). Utilisé avec les modèles de texte T4 .
  • #pragma warning [disable | restore] [numéros d'avertissement] // Désactive / restaure les avertissements du compilateur.
  • #pragma checksum " [nomfichier] " " [guid] " " [somme de contrôle] " // Valide le contenu du fichier source.
  • #region [nom de la région] // Définit une région de code réductible.
  • #endregion // Termine un bloc de région de code.
  • #if [condition] // Exécute le code ci-dessous si la condition est vraie.
  • #else // Utilisé après un #if.
  • #elif [condition] // Utilisé après un #if.
  • #endif // Termine un bloc conditionnel démarré avec #if.

Remarques

Les directives de préprocesseur sont généralement utilisées pour faciliter la modification des programmes sources et leur compilation dans différents environnements d'exécution. Les directives du fichier source indiquent au préprocesseur d'effectuer des actions spécifiques. Par exemple, le préprocesseur peut remplacer des jetons dans le texte, insérer le contenu d'autres fichiers dans le fichier source ou supprimer la compilation d'une partie du fichier en supprimant des sections de texte. Les lignes de préprocesseur sont reconnues et exécutées avant l'expansion de la macro. Par conséquent, si une macro se développe en quelque chose qui ressemble à une commande de préprocesseur, cette commande n'est pas reconnue par le préprocesseur.

Les instructions de préprocesseur utilisent le même jeu de caractères que les instructions de fichier source, sauf que les séquences d'échappement ne sont pas prises en charge. Le jeu de caractères utilisé dans les instructions de préprocesseur est identique au jeu de caractères d'exécution. Le préprocesseur reconnaît également les valeurs de caractères négatives.

Expressions conditionnelles

Les expressions conditionnelles ( #if , #elif , etc.) prennent en charge un sous-ensemble limité d'opérateurs booléens. Elles sont:

  • == et != . Celles-ci ne peuvent être utilisées que pour tester si le symbole est vrai (défini) ou faux (non défini)
  • && , || , !
  • ()

Par exemple:

#if !DEBUG && (SOME_SYMBOL || SOME_OTHER_SYMBOL) && RELEASE == true
Console.WriteLine("OK!");
#endif

compilerait le code qui imprime "OK!" à la console si DEBUG n'est pas défini, SOME_SYMBOL ou SOME_OTHER_SYMBOL est défini et RELEASE est défini.

Remarque: Ces substitutions sont effectuées au moment de la compilation et ne sont donc pas disponibles pour inspection au moment de l'exécution. Le code éliminé par l'utilisation de #if ne fait pas partie de la sortie du compilateur.

Voir aussi: Directives de préprocesseur C # sur MSDN.

Expressions conditionnelles

Lorsque ce qui suit est compilé, il renverra une valeur différente selon les directives définies.

// Compile with /d:A or /d:B to see the difference
string SomeFunction() 
{
#if A
    return "A";
#elif B
    return "B";
#else
    return "C";
#endif
}

Les expressions conditionnelles sont généralement utilisées pour enregistrer des informations supplémentaires pour les versions de débogage.

void SomeFunc()
{
    try
    {
        SomeRiskyMethod();
    }
    catch (ArgumentException ex)
    {
        #if DEBUG
        log.Error("SomeFunc", ex);
        #endif

        HandleException(ex);
    }
}

Génération des avertissements et des erreurs du compilateur

Les avertissements du compilateur peuvent être générés à l'aide de la directive #warning , et des erreurs peuvent également être générées à l'aide de la directive #error .

#if SOME_SYMBOL
#error This is a compiler Error.
#elif SOME_OTHER_SYMBOL
#warning This is a compiler Warning.
#endif

Définition et suppression de symboles

Un symbole de compilateur est un mot clé défini au moment de la compilation, qui peut être vérifié pour exécuter certaines sections de code de manière conditionnelle.

Il existe trois façons de définir un symbole de compilateur. Ils peuvent être définis via le code:

#define MYSYMBOL

Ils peuvent être définis dans Visual Studio, sous Propriétés du projet> Créer> Symboles de compilation conditionnels:

Symboles du compilateur VS

(Notez que DEBUG et TRACE ont leurs propres cases à cocher et qu’il n’est pas nécessaire de les spécifier explicitement.)

Ou ils peuvent être définis à la compilation en utilisant le commutateur /define:[name] sur le compilateur C #, csc.exe .

Vous pouvez également #undefine symboles non définis à l'aide de la directive #undefine .

L'exemple le plus courant est le symbole DEBUG , défini par Visual Studio lorsqu'une application est compilée en mode Debug (en mode Release).

public void DoBusinessLogic()
{
    try
    {
        AuthenticateUser();
        LoadAccount();
        ProcessAccount();
        FinalizeTransaction();
    }
    catch (Exception ex)
    {
#if DEBUG
        System.Diagnostics.Trace.WriteLine("Unhandled exception!");
        System.Diagnostics.Trace.WriteLine(ex);
        throw;
#else
        LoggingFramework.LogError(ex);
        DisplayFriendlyErrorMessage();
#endif
    }
}

Dans l'exemple ci-dessus, lorsqu'une erreur survient dans la logique métier de l'application, si l'application est compilée en mode débogage (et que le symbole DEBUG est défini), l'erreur sera consignée dans le journal de suivi et l'exception sera supprimée. -pour le débogage. Toutefois, si l'application est compilée en mode Release (et qu'aucun symbole DEBUG n'est défini), une structure de journalisation est utilisée pour consigner discrètement l'erreur et un message d'erreur convivial s'affiche pour l'utilisateur final.

Blocs de région

Utilisez #region et #endregion pour définir une région de code #endregion .

#region Event Handlers

public void Button_Click(object s, EventArgs e)
{
    // ...
}

public void DropDown_SelectedIndexChanged(object s, EventArgs e)
{
    // ...
}

#endregion

Ces directives ne sont utiles que lorsqu'un IDE prenant en charge des régions réductibles (telles que Visual Studio ) est utilisé pour modifier le code.

Autres instructions du compilateur

Ligne

#line contrôle le numéro de ligne et le nom de fichier signalés par le compilateur lors de la sortie des avertissements et des erreurs.

void Test()
{
    #line 42 "Answer"
    #line filename "SomeFile.cs"
    int life; // compiler warning CS0168 in "SomeFile.cs" at Line 42
    #line default
    // compiler warnings reset to default
}

Somme de contrôle Pragma

#pragma checksum permet de spécifier une somme de contrôle spécifique pour une base de données de programme (PDB) générée pour le débogage.

#pragma checksum "MyCode.cs" "{00000000-0000-0000-0000-000000000000}" "{0123456789A}"

Utilisation de l'attribut conditionnel

L'ajout d'un attribut Conditional de l'espace de noms System.Diagnostics à une méthode est un moyen efficace de contrôler les méthodes appelées dans vos builds et celles qui ne le sont pas.

#define EXAMPLE_A

using System.Diagnostics;
class Program
{
    static void Main()
    {
        ExampleA(); // This method will be called
        ExampleB(); // This method will not be called
    }

    [Conditional("EXAMPLE_A")]
    static void ExampleA() {...}

    [Conditional("EXAMPLE_B")]
    static void ExampleB() {...}
}

Désactiver et restaurer les avertissements du compilateur

Vous pouvez désactiver les avertissements du compilateur en utilisant l'avertissement #pragma warning disable et les restaurer à l'aide de la #pragma warning restore :

#pragma warning disable CS0168

// Will not generate the "unused variable" compiler warning since it was disabled
var x = 5;

#pragma warning restore CS0168

// Will generate a compiler warning since the warning was just restored
var y = 8;

Les numéros d'avertissement séparés par des virgules sont autorisés:

#pragma warning disable CS0168, CS0219

Le préfixe CS est facultatif et peut même être mélangé (bien que ce ne soit pas une bonne pratique):

#pragma warning disable 0168, 0219, CS0414

Préprocesseurs personnalisés au niveau du projet

Il est pratique de définir un prétraitement conditionnel personnalisé au niveau du projet lorsque certaines actions doivent être ignorées, disons pour les tests.

Accédez à l' Solution Explorer -> Cliquez avec le bouton droit de la souris sur le projet que vous souhaitez définir comme variable -> Properties -> Build -> En général Rechercher champ Conditional compilation symbols et entrez votre variable conditionnelle ici

entrer la description de l'image ici

Exemple de code qui ignorera du code:

public void Init()
{
    #if !IGNOREREFRESHDB
    // will skip code here
     db.Initialize();
    #endif
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow