Funktioniert #if RELEASE wie #if DEBUG in C #?

277

In allen Beispielen, die ich für die # if-Compiler-Direktive gesehen habe, wird "DEBUG" verwendet. Kann ich "RELEASE" auf die gleiche Weise verwenden, um Code auszuschließen, den ich beim Kompilieren im Debug-Modus nicht ausführen möchte? Der Code, den ich mit diesem Block umgeben möchte, sendet eine Reihe von E-Mails, und ich möchte diese nicht versehentlich beim Testen versenden.

Brian Sullivan
quelle
3
#if !DEBUGerfüllt die gleiche Funktion wie #if RELEASEhätte. Alternativ #if DEBUGdann #elsedann , #endifwenn es unterschiedliche Code in den Modi laufen.
Nat

Antworten:

275

Nein, das wird es nicht, es sei denn, Sie arbeiten.

Der wichtige Teil hier ist, was DEBUG wirklich ist, und es ist eine Art Konstante, gegen die der Compiler prüfen kann.

Wenn Sie die Projekteigenschaften auf der Registerkarte Erstellen überprüfen, finden Sie drei Dinge:

  • Ein Textfeld mit der Bezeichnung "Bedingte Kompilierungssymbole"
  • Ein Kontrollkästchen mit der Bezeichnung "DEBUG-Konstante definieren"
  • Ein Kontrollkästchen mit der Bezeichnung "TRACE-Konstante definieren"

Es gibt weder ein solches Kontrollkästchen noch eine vordefinierte Konstante / ein vordefiniertes Symbol mit dem Namen RELEASE.

Sie können diesen Namen jedoch problemlos in das Textfeld mit der Bezeichnung Bedingte Kompilierungssymbole einfügen. Stellen Sie jedoch sicher, dass Sie die Projektkonfiguration zuvor auf den Freigabemodus eingestellt haben, da diese Einstellungen pro Konfiguration gelten.

Wenn Sie dies also nicht zum Textfeld hinzufügen, #if RELEASEwird unter keiner Konfiguration Code erzeugt.

Lasse V. Karlsen
quelle
391

RELEASE ist nicht definiert, aber Sie können verwenden

#if (!DEBUG)
  ...
#endif
M4N
quelle
2
Es ist nicht so, aber natürlich können Sie den NOT-Operator so verwenden. Daran habe ich nicht gedacht, als ich meine Antwort schrieb.
Lasse V. Karlsen
4
Es funktioniert, aber die Verwendung Ihrer Lösung ist meiner Meinung nach klarer und "korrekter".
Daniel Schaffer
1
Zumal Sie mehr Konfigurationen als nur RELEASE und DEBUG haben können - für einige meiner Projekte gibt es DEBUG, RELEASE und DEPLOY oder DEV (DEBUG), TEST und PROD (RELEASE)
Adam Nofsinger
Für alle anderen, die durch die obigen Kommentare verwirrt waren, fragte sich die unbearbeitete Antwort, ob sie RELEASEdefiniert war.
Dan
41

Nee.

Während der Debug-Konfiguration gibt es eine DEBUGdefinierte Konstante (automatisch von Visual Studio definiert), während für den Release-Modus keine solche Konstante definiert ist. Überprüfen Sie Ihre Projekteinstellungen unter Build.

Wenn Sie unter Projekt -> Erstellen die Option [DEBUG-Konstante definieren] auswählen, wird am Anfang jeder Datei #define DEBUG eingefügt.

Wenn Sie eine RELEASE-Konstante für die Release-Konfiguration definieren möchten, gehen Sie zu:

  • Projekteigenschaften -> Erstellen
  • Wählen Sie den Freigabemodus
  • in den Bedingtes Kompilieren Symbole Textfeld ein: RELEASE
Pop Catalin
quelle
1
Ich fand das sehr nützlich, da ich jetzt eine RELEASE-Konstante für meine Release-Konfiguration und eine TESTING-Konstante für meine Testkonfiguration definiert habe. Sehr nützlich für die Definition erfordern https nur für die Veröffentlichung#if (RELEASE) [RequireHttps] #endif
Tekiegirl
26

Auf meiner VS-Installation (VS 2008) #if RELEASEfunktioniert nicht. Sie können jedoch nur verwenden#if !DEBUG

Beispiel:

#if !DEBUG
SendTediousEmail()
#endif
JaredPar
quelle
10

Ich habe das noch nie gesehen ... aber ich habe gesehen:

#if (DEBUG == FALSE)

und

#if (!DEBUG)

Diese Arbeit für dich?

Pete H.
quelle
Präprozessorsymbole haben keine Werte in C #; Sie sind nur "definiert" oder "nicht definiert". Es !funktioniert also nur der Operator, wie in Ihrem zweiten Beispiel.
Jonathon Reinhart
1
Laut MSDN, Sie können Operatoren wie == zu Test für wahr oder falsch verwenden. msdn.microsoft.com/en-us/library/4y6tbswk.aspx
jason_ruz
8

Sie können #if(!DEBUG)für diese Zwecke verwenden.

Abdus Salam Azad
quelle
Gut für mich war, dass ich dies in xamrian verwenden wollte, danke für das Posten.
Rogue39nin
4

"Pop Catalin" hat es richtig gemacht. Die Steuerung der Definition basierend auf der Art des Builds bietet ein hohes Maß an Flexibilität. Beispielsweise können Sie die Konfigurationen "DEBUG", "DEMO" und "RELEASE" in derselben Lösung haben. Dies verhindert die Notwendigkeit einer doppelten Programmierung mit zwei verschiedenen Lösungen.

Also ja #if RELEASEoder #if (RELEASE)funktioniert genauso, wie #if DEBUGwenn das Symbol RELEASE Conditional Compilation definiert ist.

Folgendes stammt aus dem Beitrag "Pop Catalin": Wenn Sie eine RELEASE-Konstante für die Release-Konfiguration definieren möchten, gehen Sie zu: * Projekteigenschaften -> Erstellen * Release-Modus auswählen * Geben Sie im Textfeld Bedingte Kompilierungssymbole Folgendes ein: RELEASE


quelle
2

Ich weiß, dass dies eine alte Frage ist, aber es könnte erwähnenswert sein, dass Sie Ihre eigenen Konfigurationen außerhalb von DEBUG und RELEASE erstellen können, z. B. TEST oder UAT.

Wenn Sie dann auf der Registerkarte Erstellen der Projekteigenschaften-Seite die "Bedingten Kompilierungssymbole" auf TEST setzen (zum Beispiel), können Sie ein Konstrukt wie z

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

Sie können dieses Konstrukt aus bestimmten Gründen verwenden, z. B. für verschiedene Clients, wenn Sie dies benötigen, oder sogar für ganze Webmethoden. Wir haben dies auch in der Vergangenheit verwendet, wo einige Befehle Probleme auf bestimmter Hardware verursacht haben. Daher haben wir eine Konfiguration für eine App, wenn diese auf Hardware X bereitgestellt wird.

Fetchez la vache
quelle
0

Sie können eigene Symbole für die bedingte Kompilierungszeit erstellen (einen beliebigen Namen). Gehen Sie zum "Dialogfeld" Projekterstellung "im Feld" Projekteigenschaften ", Menüoption: Projekt -> [Projektname] Eigenschaften ...

Sie können sie auch "oben in der C # -Codedatei" definieren. Mögen:

#define RELEASE
// or
#undef RELEASE

Sie können das Symbol in einer # if-Anweisung verwenden:

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

// or

#if !RELEASE
// code ...
#endif
Königskaffee
quelle
-8

warum nicht einfach

#if RELEASE
#undef DEBUG
#endif
Matt Davison
quelle
3
Es gibt keine Konstante mit dem Namen RELEASE, die von Visual Studio im Release-Modus definiert wurde.
Pop Catalin
1
/d:RELEASEwürde auch funktionieren. Sie können dies auch zu Symbolen für bedingte Kompilierung unter Release-Konfiguration (Registerkarte Projekteigenschaften erstellen) hinzufügen.
SliverNinja - MSFT