Quand utiliser les directives de préprocesseur dans .net?
Je pense que c'est une question simple, je suppose que je suis absent quelque chose d'évident. Je n'ai jamais vraiment utiliser les directives de préprocesseur, mais je cherchais un code qui fait et pensé que c'était quelque chose que je devrait être familier avec.
J'ai donc regardé la msdn exemple ici il a le code:
#define DEBUG
//...
#if DEBUG
Console.WriteLine("Debug version");
#endif
Mes deux questions sont:
- dans l'exemple ci-dessus, pourquoi font-ils définir DEBUG? J'étais sous l'impression qui a été défini si vous compiler en debug v. mode release?
- en regardant l'autre exemple qui a
#define MYTEST
puis écrit sur la console dépend si c'définie", mais comment est-ce différent de simplement en utilisant une variable? Ce qui me manque ici?
Vous devez vous connecter pour publier un commentaire.
En fait, je peux vous recommandons d'utiliser l'Attribut Conditionnel au lieu de inline #si consolidés.
Non seulement c'est plus propre et plus facile à lire puisque vous n'avez pas finir par avoir des #if, #else dans votre code. Ce style est moins sujette aux erreurs, soit le cours normal de code modifie et bien que la logique de flux erreurs.
[Conditional("DEBUG")]
et cela va affecter la compilation à l'encontre de cette bibliothèque.Généralement, l'option de compilation conditionnelle symboles seront fournis par le script de construction. Il est assez rare de voir
#define
, sauf pour très de débogage de code (si vous voyez ce que je veux dire).Re à l'aide d'une variable; j'ai souvent l'utilisation de telles conditions pour gérer le code qui doit s'exécuter sur différentes durées (mono, cf, silverlight, etc). Une variable ne peut pas suffire, car le code ne peut pas être compilé contre la mauvaise plate-forme (manque types/méthodes, etc).
Dans l'exemple présenté, je serais probablement juste utilisé
Debug.WriteLine
; puisqu'il est décoré avec[Conditional("DEBUG")]
, tous les appels sont automatiquement supprimés siDEBUG
n'est pas définie à la compilation.Probablement parce qu'il est un exemple de code. Il est destiné à montrer comment
#ifdef
et des amis. Je ne vous attendez pas à définir des symboles comme ça dans les fichiers source, sauf si c'est pour un test rapide.Si MYTEST n'est pas définie au moment de la compilation, le compilateur ne fait émettre le code entre les
#if
et#endif
blocs. Donc la résultante, IL sera plus petit.Notez également que ces ne sont pas les directives de préprocesseur en C#.
Si vous utilisez toutes les variables de votre code est compilé, lorsque vous utilisez les directives de préprocesseur seulement une partie de code inclus dans l'exécutable/dll.
Je voudrais donner un exemple où j'ai utilisé la directive de préprocesseur dans mon projet.
Mon programme crée beaucoup de fichiers intermédiaires sur le disque. J'ai utilisé #DEBUG directive de supprimer ces fichiers uniquement si mon projet est en mode release, sinon je garder ces fichiers afin que nous puissions afficher ces fichiers intermédiaires et de déterminer ce qui se passe à l'intérieur.
Lorsque mon appli fonctionne sur le serveur de production, j'ai créer un projet en mode release, de sorte que ces fichiers sont supprimés après le traitement est terminé.
J'ai un code qui a besoin d'un traitement différent lors de l'utilisation de la Mono environnement au lieu de le CLR - donc j'ai un Mono directive dans certains de mes modules. Je pense que c'est un meilleur exemple que le débogage
if (Type.GetType("System.MonoType") != null) { ... }
est la méthode recommandée pour tester si vous êtes en cours d'exécution sur le Mono de l'exécution. Notez que l'exécution de Mono n'implique pas en cours d'exécution sur Linux; Mono est disponible pour Windows ainsi que d'autres plates-formes comme les OS X.) Cependant, le test d'exécution vous est généralement une mauvaise idée. Si vous travaillez autour d'un Mono bug, tester si le bug lui-même est présent à la place.Je l'ai utilisé pour beaucoup de choses. Les messages de débogage que je veux seulement dans les versions debug; nettoyer les fichiers temporaires; inclure des fonctions de diagnostic ou d'actions.