C# si/alors directives pour debug vs libération
Dans les propriétés de la Solution, j'ai un jeu de Configuration de "libération" pour mon seul et unique projet.
Au début de la routine principale, j'ai ce code, et c'est faire preuve de "Mode=Debug".
J'ai aussi ces deux lignes au dessus:
#define DEBUG
#define RELEASE
Suis-je test le droit variable?
#if (DEBUG)
Console.WriteLine("Mode=Debug");
#elif (RELEASE)
Console.WriteLine("Mode=Release");
#endif
Mon objectif est de définir des valeurs par défaut pour les variables en fonction de débogage vs mode de diffusion.
- Vous êtes à la définition de debug et release.
Vous devez vous connecter pour publier un commentaire.
Supprimer la
#define DEBUG
dans votre code. Définir les préprocesseurs dans la configuration de build pour construire (DEBUG/_DEBUG doit être définie dans VS déjà).La raison pour laquelle il imprime "Mode=Debug" est à cause de votre
#define
puis saute leelif
.Aussi, la bonne façon de le vérifier est:
Ne pas vérifier pour la LIBÉRATION
#if
et pas#ifdef
?#ifdef
est spécifique pour le préprocesseur C/C++, C# mandats de l'utilisation de#if
.Par défaut, Visual Studio définit DEBUG si le projet est compilé en mode Debug et ne définissent pas si c'est en mode Release. De sortie n'est pas définie dans la Version par défaut, le mode. Utiliser quelque chose comme ceci:
Si vous voulez faire quelque chose uniquement en mode release:
Aussi, il est important de souligner que vous pouvez utiliser
[Conditional("DEBUG")]
attribut sur les méthodes qui retournent desvoid
de les avoir exécuté seulement si un certain symbole est défini. Le compilateur seraient supprimer tous les appels à ces méthodes si le symbole n'est pas définie:Je préfère vérifier comme ça vs la recherche d' #définit:
Avec la mise en garde que, bien sûr, vous pouvez compiler et déployer quelque chose en mode debug, mais toujours pas le débogueur.
#IF DEBUG
en situation de débogage de code qui ne devrait pas durer. Pour la production de code je suis d'accord avec l'utilisation de la ci-dessus.#DEBUG
est que cette instruction if est dans votre code et toujours vérifié où le#DEBUG
réponse supprime le code n'est pas applicable au moment de la compilation de sorte que vous n'avez pas de temps d'exécution de vérifier et de votre .exe (ou ce que vous compiler) est plus petite.Je ne suis pas un grand fan de la #si des choses, surtout si vous répandre tout autour de votre base de code, il va vous donner des problèmes où les versions de Débogage passent mais les versions Release échouer si vous ne faites pas attention.
Alors, voici ce que j'ai (inspiré par #ifdef en C#):
DebuggingService
n'est pas une classe statique et pourquoi vous avez besoin d'une interface? Est-ce quelque chose à faire avec l'aide de ce avec un conteneur IoC?La méthode
Debug.Assert
a conditionnelle attributDEBUG
. Si elle n'est pas définie, l'appel et l'affectationisDebug = true
sont éliminé:Si
DEBUG
est défini,isDebug
est fixé àtrue
(et passé àDebug.Assert
, qui ne fait rien dans ce cas).var iterations = 10; Debug.Assert((iterations = Int32.MaxValue) > 0);
Si vous essayez d'utiliser la variable définie pour le type de construction, vous devez supprimer les deux lignes ...
... ce sera la cause de la #if (DEBUG) d'être toujours le cas.
Il n'y a pas un défaut de compilation Conditionnelle symbole pour LIBÉRATION. Si vous souhaitez définir un aller les propriétés du projet, cliquez sur le Construire onglet, puis ajouter la LIBÉRATION de la symboles de compilation Conditionnelle zone de texte sous le Général tête.
L'autre option serait de le faire...
Supprimer votre définit en haut
Légèrement modifié (métisser?) la version de la réponse par Tod Thomson comme une fonction statique, plutôt que dans une classe à part (je voulais pouvoir l'appeler dans un Formulaire en ligne viewbinding à partir d'un viewutils classe, je l'avais déjà compris).
Espace de noms
Méthode
Assurez-vous de définir le DÉBOGAGE constante dans le Projet de Construire des Propriétés. Cela permettra à l'
#if DEBUG
. Je ne vois pas un pré-définis LIBÉRATION constante, de sorte que pourrait sous-entendre que ce qui n'est Pas dans un bloc de DÉBOGAGE est en mode RELEASE.Une astuce qui peut vous faire économiser beaucoup de temps - n'oubliez pas que même si vous choisissez
debug
en vertu de la configuration de build (sur vs2012/13 menu c'est en vertu de CONSTRUIRE => GESTIONNAIRE de CONFIGURATION) - ce n'est pas suffisant.Vous avez besoin de prêter attention à la PUBLIER
Configuration
, en tant que tel:Puisque le but de ces directives de compilation sont à indiquer au compilateur de ne PAS inclure de code, débogage de code,code bêta, ou peut-être le code qui est nécessaire par tous les utilisateurs finaux, à l'exception de dire que ces le département de la publicité, c'est à dire #Define AdDept vous voulez être en mesure d'inclure ou de supprimer en fonction de vos besoins. Sans avoir à changer votre code source si, par exemple, un non AdDept se fondre dans la AdDept. Alors tout ce qui doit être fait est d'inclure le #AdDept directive dans les options du compilateur page de propriétés de la version existante du programme et de faire une compilation et wa la! la fusion de code du programme, les ressorts de vie!.
Vous pouvez également utiliser un déclarative pour un nouveau processus qui n'est pas prêt pour le prime time ou qui ne peut pas être actif dans le code jusqu'à ce qu'il est temps de le libérer.
De toute façon, c'est la façon dont je le fais.
Je suis arrivé à penser à une meilleure façon. Il m'est apparu que si les blocs sont effectivement des commentaires dans d'autres configurations (en supposant que
DEBUG
ouRELEASE
; mais vrai avec n'importe quel symbole)Retirer les définitions et vérifier si le conditionnel est le mode débogage. Vous n'avez pas besoin de vérifier si la directive est en mode release.
Quelque chose comme ceci: