#If RELEASE funzionerà come #if DEBUG in C #?


277

In tutti gli esempi che ho visto della direttiva del compilatore #if, usano "DEBUG". Posso usare "RELEASE" allo stesso modo per escludere il codice che non voglio eseguire quando compilato in modalità debug? Il codice che voglio circondare con questo blocco invia un sacco di e-mail e non voglio inviarle accidentalmente durante il test.


3
#if !DEBUGsvolge la stessa funzione che #if RELEASEavrebbe. In alternativa, #if DEBUGquindi #elsepoi #endifse c'è diverso codice per l'esecuzione in modalità.
Nat

Risposte:


275

No, a meno che tu non faccia qualche lavoro.

La parte importante qui è ciò che DEBUG è davvero, ed è una sorta di costante definita che il compilatore può verificare.

Se controlli le proprietà del progetto, nella scheda Genera, troverai tre cose:

  • Una casella di testo con l'etichetta "Simboli di compilazione condizionale"
  • Una casella di controllo denominata "Definisci costante DEBUG"
  • Una casella di controllo denominata "Definisci costante TRACE"

Non esiste tale casella di controllo, né costante / simbolo predefinito che abbia il nome RELEASE.

Tuttavia, puoi facilmente aggiungere quel nome alla casella di testo etichettata Simboli di compilazione condizionale, ma assicurati di impostare la configurazione del progetto su Release-mode prima di farlo, poiché queste impostazioni sono per configurazione.

Quindi, fondamentalmente, a meno che non lo si aggiunga alla casella di testo, #if RELEASEnon verrà prodotto alcun codice in nessuna configurazione.


393

RELEASE non è definito, ma è possibile utilizzare

#if (!DEBUG)
  ...
#endif

2
Non lo è, ma ovviamente puoi usare l'operatore NOT in questo modo. Non ci ho pensato quando ho scritto la mia risposta.
Lasse V. Karlsen,

4
Lo fa, ma l'utilizzo della soluzione è più chiaro e "più corretto", IMHO.
Daniel Schaffer,

1
Soprattutto perché puoi avere più configurazioni oltre a RELEASE e DEBUG - per alcuni dei miei progetti c'è DEBUG, RELEASE e DEPLOY o DEV (DEBUG), TEST e PROD (RELEASE)
Adam Nofsinger,

Per chiunque altro confuso dai commenti sopra, la risposta inedita si chiedeva se RELEASEfosse stata definita.
Dan,

41

No.

Durante la configurazione del debug esiste una DEBUGcostante definita (definita automaticamente da Visual Studio) mentre non esiste una costante definita per la modalità di rilascio. Controlla le impostazioni del tuo progetto sotto build.

Selezionando [Definisci costante DEBUG] in Progetto -> Build è come includere #define DEBUG all'inizio di ogni file.

Se si desidera definire una costante RELEASE per la configurazione della versione, andare a:

  • Proprietà del progetto -> Crea
  • Seleziona la modalità di rilascio
  • nella casella di testo Simboli di compilazione condizionale immettere: RELEASE

1
Ho trovato questo molto utile in quanto ora ho definito una costante RELEASE per la mia configurazione di Release e una costante TESTING per la mia configurazione di Test. Molto utile per la definizione richiede https solo per il rilascio#if (RELEASE) [RequireHttps] #endif
tekiegirl

27

Sulla mia installazione VS (VS 2008) #if RELEASEnon funziona. Tuttavia potresti semplicemente usare#if !DEBUG

Esempio:

#if !DEBUG
SendTediousEmail()
#endif

10

Non l'ho mai visto prima ... ma ho visto:

#if (DEBUG == FALSE)

e

#if (!DEBUG)

Che lavoro per te?


I simboli del preprocessore non hanno valori in C #; sono semplicemente "definiti" o "non definiti". Quindi funzionerà solo l' !operatore, come nel tuo secondo esempio.
Jonathon Reinhart,

1
Secondo MSDN, è possibile utilizzare operatori come == per testare true o false. msdn.microsoft.com/en-us/library/4y6tbswk.aspx
jason_ruz

8

È possibile utilizzare #if(!DEBUG)per questo scopo.


Un buon salvataggio per me è stato voler usarlo in xamrian grazie per la pubblicazione.
rogue39nin,

4

"Pop Catalin" ha capito bene. Il controllo della definizione in base al tipo di build offre una grande flessibilità. Ad esempio, è possibile avere una configurazione "DEBUG", "DEMO" e "RELEASE" nella stessa soluzione. Ciò impedisce la necessità di una programmazione duplicata con due diverse soluzioni.

Quindi sì #if RELEASEo #if (RELEASE)funziona come #if DEBUGquando viene definito il simbolo di compilazione condizionale RELEASE.

Quanto segue è tratto dal post "Pop Catalin": Se si desidera definire una costante RELEASE per la configurazione del rilascio, andare su: * Proprietà progetto -> Build * Selezionare la modalità di rilascio * nella casella di testo Simboli di compilazione condizionale immettere: RELEASE


2

So che questa è una vecchia domanda, ma vale la pena ricordare che è possibile creare le proprie configurazioni al di fuori di DEBUG e RELEASE, come TEST o UAT.

Se poi nella scheda Build della pagina delle proprietà del progetto imposti i "Simboli di compilazione condizionale" su TEST (ad esempio) puoi usare un costrutto come

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

È possibile utilizzare questo costrutto per motivi specifici, ad esempio client diversi, se necessario, o persino interi metodi Web, ad esempio. Lo abbiamo anche usato in passato in cui alcuni comandi hanno causato problemi su hardware specifico, quindi abbiamo una configurazione per un'app quando distribuita all'hardware X.


0

Puoi creare i tuoi simboli condizionali in fase di compilazione (qualsiasi nome ti piaccia). Vai alla "finestra di dialogo Build progetto", situata nella finestra delle proprietà del progetto, opzione di menu: Progetto -> Proprietà [nome progetto] ...

Puoi anche definirli "all'inizio del file di codice C #". Piace:

#define RELEASE
// or
#undef RELEASE

puoi usare il simbolo in un'istruzione #if:

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

// or

#if !RELEASE
// code ...
#endif

-8

perché non solo

#if RELEASE
#undef DEBUG
#endif

3
Non esiste una costante denominata RELEASE definita da Visual Studio in modalità di rilascio.
Pop Catalin,

1
/d:RELEASEfunzionerebbe anche. È inoltre possibile aggiungere questo ai simboli di compilazione condizionale in Configurazione di rilascio (scheda di creazione delle proprietà del progetto).
SliverNinja - MSFT,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.