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.


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.


393

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

#if (!DEBUG)
  ...
#endif

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

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

10

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

#if (DEBUG == FALSE)

et

#if (!DEBUG)

Ça marche pour toi?


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


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


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.


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

-8

pourquoi pas

#if RELEASE
#undef DEBUG
#endif

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.