Est-ce que #if RELEASE fonctionnera comme #if DEBUG en C #?

277

Dans tous les exemples que j'ai vus de la directive du compilateur #if, ils utilisent "DEBUG". Puis-je utiliser "RELEASE" de la même manière pour exclure le code que je ne veux pas exécuter lorsqu'il est compilé en mode débogage? Le code que je veux entourer avec ce bloc envoie un tas d'e-mails, et je ne veux pas les envoyer accidentellement lors des tests.

Brian Sullivan
la source
3
#if !DEBUGsert la même fonction que l' #if RELEASEaurait fait. Sinon, #if DEBUGalors #elsealors #endifs'il y a un code différent pour exécuter dans les modes.
Nat

Réponses:

275

Non, sauf si vous travaillez.

La partie importante ici est ce qu'est réellement DEBUG, et c'est une sorte de constante définie que le compilateur peut vérifier.

Si vous vérifiez les propriétés du projet, sous l'onglet Générer, vous trouverez trois choses:

  • Une zone de texte intitulée "Symboles de compilation conditionnelle"
  • Une case à cocher intitulée "Définir la constante DEBUG"
  • Une case à cocher intitulée "Définir une constante TRACE"

Il n'y a pas de case à cocher, ni de constante / symbole prédéfini qui porte le nom RELEASE.

Cependant, vous pouvez facilement ajouter ce nom à la zone de texte intitulée Symboles de compilation conditionnelle, mais assurez-vous de définir la configuration du projet en mode Release avant de le faire, car ces paramètres sont par configuration.

Donc, fondamentalement, à moins que vous n'ajoutiez cela à la zone de texte, #if RELEASEne produira aucun code sous aucune configuration.

Lasse V. Karlsen
la source
393

RELEASE n'est pas défini, mais vous pouvez utiliser

#if (!DEBUG)
  ...
#endif
M4N
la source
2
Ce n'est pas le cas, mais bien sûr, vous pouvez utiliser l'opérateur NOT comme ça. Je n'ai pas pensé à ça quand j'ai écrit ma réponse.
Lasse V. Karlsen
4
C'est le cas, mais l'utilisation de votre solution est plus claire et "plus correcte", à mon humble avis.
Daniel Schaffer
1
D'autant plus que vous pouvez avoir plus de configurations que RELEASE et DEBUG - pour certains de mes projets, il y a DEBUG, RELEASE et DEPLOY ou DEV (DEBUG), TEST et PROD (RELEASE)
Adam Nofsinger
Pour toute autre personne déroutée par les commentaires ci-dessus, la réponse non révisée se demandait si elle RELEASEétait définie.
Dan
41

Nan.

En configuration de débogage, il existe une DEBUGconstante définie (définie automatiquement par Visual Studio) alors qu'aucune telle constante n'est définie pour le mode de publication. Vérifiez les paramètres de votre projet en cours de construction.

Sélectionner [Define DEBUG constant] sous Project -> Build revient à inclure #define DEBUG au début de chaque fichier.

Si vous souhaitez définir une constante RELEASE pour la configuration de la version, accédez à:

  • Propriétés du projet -> Créer
  • Sélectionnez le mode de libération
  • dans la zone de texte Symboles de compilation conditionnelle, entrez: RELEASE
Pop Catalin
la source
1
J'ai trouvé cela très utile car j'ai maintenant défini une constante RELEASE pour ma configuration Release et une constante TESTING pour ma configuration Testing. Très utile pour définir nécessite https uniquement pour la sortie#if (RELEASE) [RequireHttps] #endif
tekiegirl
27

Sur mon installation VS (VS 2008) #if RELEASEne fonctionne pas. Cependant, vous pouvez simplement utiliser#if !DEBUG

Exemple:

#if !DEBUG
SendTediousEmail()
#endif
JaredPar
la source
10

Je n'avais jamais vu ça auparavant ... mais j'ai vu:

#if (DEBUG == FALSE)

et

#if (!DEBUG)

Ça marche pour toi?

Pete H.
la source
Les symboles de préprocesseur n'ont pas de valeurs en C #; ils sont simplement "définis" ou "non définis". Ainsi, seul l' !opérateur fonctionnera, comme dans votre deuxième exemple.
Jonathon Reinhart
1
Selon MSDN, vous pouvez utiliser des opérateurs comme == pour tester vrai ou faux. msdn.microsoft.com/en-us/library/4y6tbswk.aspx
jason_ruz
8

Vous pouvez utiliser #if(!DEBUG)à cette fin.

Abdus Salam Azad
la source
Bon pour moi, je voulais utiliser ceci dans xamrian merci pour la publication.
rogue39nin
4

"Pop Catalin" a raison. Le contrôle de la définition en fonction du type de build offre une grande flexibilité. Par exemple, vous pouvez avoir une configuration "DEBUG", "DEMO" et "RELEASE" dans la même solution. Cela évite d'avoir à dupliquer la programmation avec deux solutions différentes.

Donc, oui #if RELEASEou #if (RELEASE)fonctionne de la même manière que #if DEBUGlorsque le symbole de compilation conditionnelle RELEASE est défini.

Ce qui suit est tiré de la publication "Pop Catalin": Si vous souhaitez définir une constante RELEASE pour la configuration de la version, allez dans: * Propriétés du projet -> Build * Sélectionnez le mode Release * dans la zone de texte Symboles de compilation conditionnelle, entrez: RELEASE


la source
2

Je sais que c'est une vieille question, mais il convient de mentionner que vous pouvez créer vos propres configurations en dehors de DEBUG et RELEASE, telles que TEST ou UAT.

Si ensuite sur l'onglet Build de la page des propriétés du projet, vous définissez les "symboles de compilation conditionnelle" sur TEST (par exemple), vous pouvez alors utiliser une construction telle que

#if (DEBUG || TEST )
    //Code that will not be executed in RELEASE or UAT
#endif

Vous pouvez utiliser cette construction pour des raisons spécifiques telles que différents clients si vous en avez besoin, ou même des méthodes Web entières par exemple. Nous l'avons également utilisé dans le passé lorsque certaines commandes ont causé des problèmes sur du matériel spécifique, nous avons donc une configuration pour une application lorsqu'elle est déployée sur le matériel X.

Fetchez la vache
la source
0

Vous pouvez créer vos propres symboles de compilation conditionnels (n'importe quel nom que vous aimez). Allez dans la "boîte de dialogue de construction du projet", située dans la boîte de propriétés du projet, option de menu: Projet -> [nom du projet] Propriétés ...

Vous pouvez également les définir "en haut du fichier de code C #". Comme:

#define RELEASE
// or
#undef RELEASE

vous pouvez utiliser le symbole dans une instruction #if:

#if RELEASE
// code ...
#elif 
// code ...
#endif

// or

#if !RELEASE
// code ...
#endif
Café King
la source
-8

pourquoi pas

#if RELEASE
#undef DEBUG
#endif
Matt Davison
la source
3
Il n'y a pas de constante nommée RELEASE définie par Visual Studio en mode release.
Pop Catalin
1
/d:RELEASEfonctionnerait également. Vous pouvez également l'ajouter aux symboles de compilation conditionnelle sous Configuration de la version (onglet de création des propriétés du projet).
SliverNinja - MSFT