Czy #if RELEASE będzie działać tak jak #if DEBUG działa w C #?

277

We wszystkich przykładach dyrektywy kompilatora #if, które widziałem, używają „DEBUG”. Czy mogę używać „RELEASE” w ten sam sposób, aby wykluczyć kod, którego nie chcę uruchamiać, gdy jest skompilowany w trybie debugowania? Kod, który chcę otoczyć tym blokiem, wysyła wiele e-maili i nie chcę ich przypadkowo wysłać podczas testowania.

Brian Sullivan
źródło
3
#if !DEBUGpełni tę samą funkcję, co #if RELEASEmiałoby. Alternatywnie, #if DEBUGpo czym #elsenastępnie #endif, czy istnieje inny kod do uruchomienia w trybach.
Nat

Odpowiedzi:

275

Nie zrobi tego, chyba że wykonasz jakąś pracę.

Ważną częścią tutaj jest to, czym naprawdę jest DEBUG, i jest to rodzaj stałej zdefiniowanej, którą kompilator może sprawdzić.

Jeśli sprawdzisz właściwości projektu, w zakładce Kompilacja znajdziesz trzy rzeczy:

  • Pole tekstowe oznaczone „Symbole kompilacji warunkowej”
  • Pole wyboru oznaczone jako „Zdefiniuj stałą DEBUG”
  • Pole wyboru oznaczone „Zdefiniuj stałą TRACE”

Nie ma takiego pola wyboru ani predefiniowanej stałej / symbolu o nazwie RELEASE.

Możesz jednak z łatwością dodać tę nazwę do pola tekstowego oznaczonego Symbole kompilacji warunkowej, ale upewnij się, że ustawiłeś wcześniej konfigurację projektu w tryb Release, ponieważ ustawienia te dotyczą poszczególnych konfiguracji.

Zasadniczo, chyba że dodasz to do pola tekstowego, #if RELEASEnie wygeneruje żadnego kodu w żadnej konfiguracji.

Lasse V. Karlsen
źródło
393

RELEASE nie jest zdefiniowany, ale możesz użyć

#if (!DEBUG)
  ...
#endif
M4N
źródło
2
Tak nie jest, ale oczywiście możesz użyć operatora NOT w ten sposób. Nie pomyślałem o tym, kiedy napisałem swoją odpowiedź.
Lasse V. Karlsen
4
Tak, ale korzystanie z rozwiązania jest jaśniejsze i „bardziej poprawne”, IMHO.
Daniel Schaffer
1
Zwłaszcza, że ​​możesz mieć więcej konfiguracji niż tylko RELEASE i DEBUG - dla niektórych moich projektów jest DEBUG, RELEASE i DEPLOY lub DEV (DEBUG), TEST i PROD (RELEASE)
Adam Nofsinger
Dla wszystkich innych, którzy są zdezorientowani powyższymi komentarzami, niezmieniona odpowiedź zastanawiała się, czy RELEASEzostała zdefiniowana.
Dan
41

Nie.

Podczas konfiguracji debugowania istnieje DEBUGzdefiniowana stała (automatycznie definiowana przez Visual Studio), podczas gdy nie ma takiej stałej zdefiniowanej dla trybu wydania. Sprawdź ustawienia projektu w trakcie budowy.

Wybranie opcji [Zdefiniuj stałą DEBUG] w polu Projekt -> Kompilacja jest jak włączenie # zdefiniowanie DEBUG na początku każdego pliku.

Jeśli chcesz zdefiniować stałą RELEASE dla konfiguracji wydania, przejdź do:

  • Właściwości projektu -> Kompilacja
  • Wybierz tryb zwolnienia
  • w polu tekstowym Symbole kompilacji warunkowej wpisz: RELEASE
Pop Catalin
źródło
1
Okazało się to bardzo przydatne, ponieważ zdefiniowałem stałą RELEASE dla mojej konfiguracji Release i stałą TESTING dla mojej konfiguracji Testowania. Bardzo przydatny do definiowania wymaga https tylko do wydania#if (RELEASE) [RequireHttps] #endif
tekiegirl
27

W mojej instalacji VS (VS 2008) #if RELEASEnie działa. Jednak możesz po prostu użyć#if !DEBUG

Przykład:

#if !DEBUG
SendTediousEmail()
#endif
JaredPar
źródło
10

Nigdy wcześniej tego nie widziałem ... ale widziałem:

#if (DEBUG == FALSE)

i

#if (!DEBUG)

Ta praca dla ciebie?

Pete H.
źródło
Symbole preprocesora nie mają wartości w C #; są po prostu „zdefiniowane” lub „nie zdefiniowane”. Więc tylko !operator będzie działał, jak w twoim drugim przykładzie.
Jonathon Reinhart
1
Według MSDN możesz używać operatorów takich jak == do testowania na prawda lub fałsz. msdn.microsoft.com/en-us/library/4y6tbswk.aspx
jason_ruz
8

Możesz użyć #if(!DEBUG)do tego celu.

Abdus Salam Azad
źródło
Dobry zapis dla mnie to chcieć użyć tego w Xamrian dzięki za wysłanie.
rogue39nin
4

„Pop Catalin” ma rację. Kontrolowanie definicji w oparciu o rodzaj kompilacji zapewnia dużą elastyczność. Na przykład możesz mieć konfigurację „DEBUG”, „DEMO” i „RELEASE” w tym samym rozwiązaniu. Zapobiega to konieczności powielania programowania z dwoma różnymi rozwiązaniami.

Tak #if RELEASElub #if (RELEASE)działa tak samo, jak w #if DEBUGprzypadku zdefiniowania symbolu kompilacji warunkowej RELEASE.

Poniższy fragment pochodzi z postu „Pop Catalin”: Jeśli chcesz zdefiniować stałą RELEASE dla konfiguracji wydania, przejdź do: * Właściwości projektu -> Kompilacja * Wybierz tryb wydania * w polu tekstowym Symbole kompilacji warunkowej wpisz: RELEASE


źródło
2

Wiem, że to stare pytanie, ale warto wspomnieć, że możesz tworzyć własne konfiguracje poza DEBUG i RELEASE, takie jak TEST lub UAT.

Jeśli następnie na karcie Kompilacja strony właściwości projektu ustawisz „Symbole kompilacji warunkowej” na TEST (na przykład), możesz użyć konstrukcji takiej jak:

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

Możesz użyć tej konstrukcji z konkretnego powodu, na przykład różnych klientów, jeśli potrzebujesz, lub nawet całych metod internetowych. Użyliśmy tego również w przeszłości, gdy niektóre polecenia powodowały problemy na określonym sprzęcie, więc mamy konfigurację aplikacji po wdrożeniu na sprzęcie X.

Fetchez la vache
źródło
0

Możesz stworzyć własne warunkowe symbole kompilacji (dowolna nazwa, którą lubisz). Przejdź do „okna dialogowego kompilacji projektu”, znajdującego się w polu właściwości projektu, opcja menu: Projekt -> [nazwa projektu] Właściwości ...

Możesz również zdefiniować je „na górze pliku kodu C #”. Lubić:

#define RELEASE
// or
#undef RELEASE

możesz użyć tego symbolu w instrukcji #if:

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

// or

#if !RELEASE
// code ...
#endif
King Coffee
źródło
-8

dlaczego nie tylko

#if RELEASE
#undef DEBUG
#endif
Matt Davison
źródło
3
W trybie wydania nie ma stałej o nazwie RELEASE zdefiniowanej przez Visual Studio.
Pop Catalin
1
/d:RELEASEteż by działał. Możesz również dodać to do symboli kompilacji warunkowej w obszarze Konfiguracja wersji (karta budowania właściwości projektu).
SliverNinja - MSFT