Dans les propriétés de la solution, la configuration est définie sur "version" pour mon seul et unique projet.
Au début de la routine principale, j'ai ce code, et il montre "Mode = Debug". J'ai également ces deux lignes tout en haut:
#define DEBUG
#define RELEASE
Suis-je en train de tester la bonne variable?
#if (DEBUG)
Console.WriteLine("Mode=Debug");
#elif (RELEASE)
Console.WriteLine("Mode=Release");
#endif
Mon objectif est de définir différentes valeurs par défaut pour les variables basées sur le mode débogage vs libération.
c#
debugging
release
compiler-directives
NealWalters
la source
la source
Réponses:
DEBUG
/_DEBUG
devrait déjà être défini dans VS.Supprimez le
#define DEBUG
dans votre code. Définissez des préprocesseurs dans la configuration de génération pour cette génération spécifique.La raison pour laquelle il affiche "Mode = Debug" est à cause de votre
#define
, puis ignore leelif
.La bonne façon de vérifier est:
Ne vérifiez pas
RELEASE
.la source
#if
et non#ifdef
?#ifdef
est spécifique au préprocesseur de C / C ++, C # rend obligatoire l'utilisation de#if
.Par défaut, Visual Studio définit DEBUG si le projet est compilé en mode Debug et ne le définit pas s'il est en mode Release. RELEASE n'est pas défini par défaut en mode Release. Utilisez quelque chose comme ceci:
Si vous voulez faire quelque chose uniquement en mode release:
En outre, il convient de souligner que vous pouvez utiliser l'
[Conditional("DEBUG")]
attribut sur les méthodes qui retournentvoid
pour les exécuter uniquement si un certain symbole est défini. Le compilateur supprimerait tous les appels à ces méthodes si le symbole n'est pas défini:la source
Je préfère le vérifier comme ça plutôt que de chercher des
#define
directives:Avec la mise en garde que, bien sûr, vous pouvez compiler et déployer quelque chose en mode débogage mais sans avoir le débogueur attaché.
la source
#IF DEBUG
en situation de débogage du code cela ne devrait pas durer. Pour le code de production, je suis d'accord avec l'utilisation de ce qui précède.#DEBUG
est que cette instruction if est dans votre code et toujours vérifiée où, comme la#DEBUG
réponse supprime le code qui n'est pas applicable au moment de la compilation, vous n'avez donc pas de vérification à l'exécution et votre. exe (ou tout ce que vous compilez) est plus petit.Je ne suis pas un grand fan du truc #if, surtout si vous le répandez tout autour de votre base de code car cela vous posera des problèmes là où les versions de débogage passent, mais les versions de Release échouent si vous ne faites pas attention.
Voici donc ce que j'ai trouvé (inspiré par #ifdef en C # ):
la source
DebuggingService
n'est pas une classe statique et pourquoi vous avez besoin d'une interface? Est-ce quelque chose à voir avec son utilisation avec un conteneur IoC?La méthode
Debug.Assert
a un attribut conditionnelDEBUG
. S'il n'est pas défini, l'appel et l'affectationisDebug = true
sont supprimés :Si
DEBUG
est défini,isDebug
est défini surtrue
(et transmis àDebug.Assert
, ce qui ne fait rien dans ce cas).la source
var iterations = 10; Debug.Assert((iterations = Int32.MaxValue) > 0);
Si vous essayez d'utiliser la variable définie pour le type de build, vous devez supprimer les deux lignes ...
... ceux-ci feront que le #if (DEBUG) sera toujours vrai.
Il n'y a pas non plus de symbole de compilation conditionnelle par défaut pour RELEASE . Si vous souhaitez en définir un, accédez aux propriétés du projet, cliquez sur l' onglet Générer , puis ajoutez RELEASE dans la zone de texte Symboles de compilation conditionnelle sous l'en - tête Général .
L'autre option serait de le faire ...
la source
Retirez vos définitions en haut
la source
Version légèrement modifiée (bâtarde?) De la réponse de Tod Thomson en tant que fonction statique plutôt que classe distincte (je voulais pouvoir l'appeler dans une liaison WebForm à partir d'une classe viewutils que j'avais déjà incluse).
la source
Veillez à définir la constante DEBUG dans les propriétés de construction du projet. Cela permettra au
#if DEBUG
. Je ne vois pas de constante RELEASE prédéfinie, ce qui pourrait impliquer que tout ce qui n'est pas dans un bloc DEBUG est en mode RELEASE.la source
NameSpace
Méthode
la source
Une astuce qui peut vous faire gagner beaucoup de temps - n'oubliez pas que même si vous choisissez
debug
sous la configuration de construction (dans le menu vs2012 / 13, c'est sous BUILD => CONFIGURATION MANAGER) - ce n'est pas suffisant.Vous devez faire attention à la PUBLICATION
Configuration
, en tant que telle:la source
Étant donné que le but de ces directives COMPILER est de dire au compilateur de ne PAS inclure de code, de code de débogage, de code bêta ou peut-être de code dont tous vos utilisateurs finaux ont besoin, sauf ceux du service de publicité, c'est-à-dire #Define AdDept que vous souhaitez pouvoir les inclure ou les supprimer en fonction de vos besoins. Sans avoir à changer votre code source si par exemple un non AdDept fusionne dans l'AdDept. Ensuite, tout ce qui doit être fait est d'inclure la directive #AdDept dans la page de propriétés des options du compilateur d'une version existante du programme et de faire une compilation et wa la! le code du programme fusionné prend vie!.
Vous pouvez également vouloir utiliser un déclaratif 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 soit temps de le libérer.
Quoi qu'il en soit, c'est comme ça que je le fais.
la source
Je dois penser à une meilleure façon. Il m'est apparu que les blocs #if sont effectivement des commentaires dans d'autres configurations (en supposant
DEBUG
ouRELEASE
; mais vrai avec n'importe quel symbole)la source
Supprimez les définitions et vérifiez si le conditionnel est en mode débogage. Vous n'avez pas besoin de vérifier si la directive est en mode release.
Quelque chose comme ça:
la source