We właściwościach rozwiązania mam konfigurację ustawioną na „release” dla mojego jedynego projektu.
Na początku głównej procedury mam ten kod i pokazuje on „Mode = Debug”. Te dwie linie mam też na samej górze:
#define DEBUG
#define RELEASE
Czy testuję odpowiednią zmienną?
#if (DEBUG)
Console.WriteLine("Mode=Debug");
#elif (RELEASE)
Console.WriteLine("Mode=Release");
#endif
Moim celem jest ustawienie różnych wartości domyślnych dla zmiennych opartych na trybie debugowania vs.
c#
debugging
release
compiler-directives
NealWalters
źródło
źródło
Odpowiedzi:
DEBUG
/_DEBUG
należy już zdefiniować w VS.Usuń
#define DEBUG
w swoim kodzie. Ustaw preprocesory w konfiguracji kompilacji dla tej konkretnej kompilacji.Powodem, dla którego drukuje „Tryb = Debugowanie”, jest twój,
#define
a następnie pomijaelif
.Właściwy sposób sprawdzenia to:
Nie sprawdzaj
RELEASE
.źródło
#if
nie#ifdef
?#ifdef
jest specyficzny dla preprocesora C / C ++, C # wymaga użycia#if
.Domyślnie Visual Studio definiuje DEBUGĘ, jeśli projekt jest kompilowany w trybie debugowania i nie definiuje go, jeśli jest w trybie zwolnienia. RELEASE nie jest domyślnie zdefiniowane w trybie Release. Użyj czegoś takiego:
Jeśli chcesz zrobić coś tylko w trybie zwolnienia:
Warto również zauważyć, że można użyć
[Conditional("DEBUG")]
atrybutu w metodach, które powracają,void
aby były wykonywane tylko wtedy, gdy określony jest określony symbol. Kompilator usunie wszystkie wywołania tych metod, jeśli symbol nie zostanie zdefiniowany:źródło
Wolę to sprawdzić w ten sposób niż szukać
#define
dyrektyw:Z zastrzeżeniem, że można oczywiście skompilować i wdrożyć coś w trybie debugowania, ale nadal nie ma podłączonego debugera.
źródło
#IF DEBUG
w sytuacji debugowania kodu, który nie powinien trwać. W przypadku kodu produkcyjnego zgadzam się na użycie powyższego.#DEBUG
jest to, że ta instrukcja if znajduje się w kodzie i zawsze jest sprawdzana, ponieważ#DEBUG
odpowiedź usuwa kod, który nie ma zastosowania w czasie kompilacji, więc nie masz kontroli wykonania w czasie wykonywania. exe (lub cokolwiek skompilujesz) jest mniejszy.Nie jestem wielkim fanem rzeczy #if, szczególnie jeśli rozprowadzasz je wokół swojej bazy kodu, ponieważ spowoduje to problemy z przejściem kompilacji Debug, ale kompilacje Release zakończą się niepowodzeniem, jeśli nie będziesz ostrożny.
Oto co wymyśliłem (zainspirowany #ifdef w C # ):
źródło
DebuggingService
nie jest to klasa statyczna i dlaczego potrzebujesz interfejsu? Czy to ma coś wspólnego z używaniem tego z kontenerem IoC?Metoda
Debug.Assert
ma atrybut warunkowyDEBUG
. Jeśli nie jest zdefiniowane, połączenie i przypisanieisDebug = true
są eliminowane :Jeśli
DEBUG
jest zdefiniowane,isDebug
jest ustawione natrue
(i przekazywane doDebug.Assert
, co w tym przypadku nic nie robi).źródło
var iterations = 10; Debug.Assert((iterations = Int32.MaxValue) > 0);
Jeśli próbujesz użyć zmiennej zdefiniowanej dla typu kompilacji, powinieneś usunąć dwie linie ...
... spowoduje to #if (DEBUG) będzie zawsze prawdziwe.
Nie ma też domyślnego symbolu kompilacji warunkowej dla WYDANIA . Jeśli chcesz zdefiniować jedno przejście do właściwości projektu, kliknij kartę Kompiluj , a następnie dodaj UWOLNIENIE do pola tekstowego Symbole kompilacji warunkowej pod nagłówkiem Ogólne .
Inną opcją byłoby zrobienie tego ...
źródło
Usuń definicje u góry
źródło
Nieznacznie zmodyfikowana (zaryzykowana?) Wersja odpowiedzi Toda Thomsona jako funkcja statyczna, a nie osobna klasa (chciałem móc ją wywoływać w powiązaniu widoku WebForm z klasy viewutils, którą już załączyłem).
źródło
Należy zdefiniować stałą DEBUG we właściwościach kompilacji projektu. Umożliwi to
#if DEBUG
. Nie widzę wstępnie zdefiniowanej stałej RELEASE, więc może to sugerować, że wszystko, co nie jest w bloku DEBUG, jest trybem RELEASE.źródło
NameSpace
metoda
źródło
Wskazówka, która może zaoszczędzić dużo czasu - nie zapomnij o tym, nawet jeśli wybierzesz
debug
w konfiguracji kompilacji (w menu vs2012 / 13 jest to w BUILD => MENEDŻER KONFIGURACJI) - to nie wystarczy.Musisz zwrócić uwagę na PUBLIKAC
Configuration
jako taki:źródło
Ponieważ celem tych dyrektyw KOMPILERA jest poinformowanie kompilatora, aby NIE zawierał kodu, kodu debugowania, kodu beta, a może kodu, który jest potrzebny wszystkim użytkownikom końcowym, z wyjątkiem tych, którzy mówią działowi reklamy, tj. #Define AdDept, który chcesz być w stanie je uwzględnić lub usunąć w zależności od potrzeb. Bez konieczności zmiany kodu źródłowego, jeśli na przykład nie-AdDept łączy się z AdDept. Następnie wszystko, co należy zrobić, to dołączyć dyrektywę #AdDept do strony właściwości opcji kompilatora istniejącej wersji programu i wykonać kompilację i wa la! kod scalonego programu odżywa!
Możesz także użyć deklaratywnego dla nowego procesu, który nie jest gotowy na czas pierwszorzędny lub który nie może być aktywny w kodzie, dopóki nie nadejdzie czas na jego zwolnienie.
W każdym razie tak to robię.
źródło
Zacząłem myśleć o lepszym sposobie. Przyszło mi do głowy, że bloki #if są skutecznie komentarzami w innych konfiguracjach (przy założeniu
DEBUG
lubRELEASE
; ale prawdziwe z dowolnym symbolem)źródło
Usuń definicje i sprawdź, czy warunek jest w trybie debugowania. Nie musisz sprawdzać, czy dyrektywa jest w trybie zwolnienia.
Coś takiego:
źródło