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.


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.


393

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

#if (!DEBUG)
  ...
#endif

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

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

10

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

#if (DEBUG == FALSE)

i

#if (!DEBUG)

Ta praca dla ciebie?


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


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


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.


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

-8

dlaczego nie tylko

#if RELEASE
#undef DEBUG
#endif

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.