2010-05-18 18 views

Odpowiedz

22

W trybie debug:

#if DEBUG 
      System.Console.WriteLine("Debug version"); 
#endif 
      System.Console.WriteLine("Output"); 

wyprowadzane jako

Debug version 
Output 

W trybie wydania:

#if DEBUG 
      System.Console.WriteLine("Debug version"); 
#endif 
      System.Console.WriteLine("Output"); 

wyprowadzane jako

Output 

przeczytać: #if (C# Reference)

Zastosowanie: Jeśli masz zestaw wartości mają być testowane w trybie debugowania, a nie w trybie zwolnienia można skorzystać #if DEBUG

5

Nie musisz jej wcale używać. Celem jest posiadanie sekcji kodu, które są kompilowane tylko w trybie debugowania. na przykład możesz mieć kod zezwalający na administratora, który mógłby udawać innego użytkownika w systemie do testowania i debugowania prufoses. Nie chciałbyś, aby ten użytkownik był włączony w kodzie zwolnienia ze względów bezpieczeństwa, więc możesz zawinąć odpowiednie sekcje kodu w #if DEBUG i zostaną one wykluczone z kodu zwolnienia.

+2

lub po prostu nie pokazać ekran powitalny podczas debugowania , oszczędzając sekundę lub dwie. Takie rzeczy. – TomTom

+2

@TomTom: a może nie wyświetlasz ekranu powitalnego * kiedykolwiek *? – MusiGenesis

5

Podczas kompilacji można ustawić flagi kompilatora, których można użyć do umieszczenia kodu w tych dyrektywach. Ten kod nie zostanie skompilowany i nigdy nie zakończy się końcowym wynikiem montażu. DEBUG jest jednym z predefiniowanych, ale możesz użyć własnego.

Jako przykład użycia: W jednym z bieżących wydarzeń używamy flagi kompilatora, aby określić, czy użyć maski logowania, aby zalogować użytkownika, czy też logowanie powinno nastąpić automatycznie z bieżącą osobą. Drugi tryb przeznaczony jest tylko dla programistów debugowanie jest szybsze bez konieczności logowania.

Inny przykład: w niektórych kodach mono zobaczysz flagi. W tym przypadku kod może być kompilowany inaczej, gdy np. targetowanie w innym środowisku, ponieważ używa klas, które mogą nie istnieć we wcześniejszych wersjach.

Wiąże się z tym warunkowy -atrybut, za pomocą którego można oznaczyć metodę. Jeśli wspomniana flaga nie jest ustawiona, wywołania metody nie zostaną wykonane. Metoda nadal kończy się w IL, ale połączenia zostaną usunięte.

Sprawdź na przykład następujący kod:

var mthods = typeof (Debug).GetMethods().Where(mi => mi.Name.Equals("WriteLine")).ToList(); 
var attribs = mthods[0].GetCustomAttributes(true); 

Można zauważyć, że metoda Debug.WriteLine posiada atrybut warunkowego zastosowane do niego: Połączenia zostanie on usunięty podczas kompilowania BEZ flaga DEBUG kompilatora.

17

Możesz czuć się bardziej komfortowo z atrybutem Conditional, które mogą być używane w celu wykluczenia całych metody, bez konieczności komplikować źródło z warunkowych na stronie wywołującego:

[Conditional("DEBUG")] 
void Foo() 
{ 
} 

Foo() śmiało można nazwać zarówno debugowanie i zwalnianie - jednak w trybie zwolnienia byłaby to operacja "no-op".

+0

co to jest 'no-op'? – gingerbreadboy

+7

To specjalne polecenie IL, które zasadniczo mówi "nic nie rób". Jest to szczególnie przydatne, gdy umieścisz punkty przerwania w miejscach, w których nic się nie dzieje (np. Otwarty nawias) - w ten sposób debugger może zsynchronizować kod i wykonać polecenie IL – flq

+1

+1 dla operacji bez zgody operatora. pięknie wytłumaczyć .. –

3

przydaje się również podczas testowania usług Windows. Możesz wstawić #if DEBUG, aby rozpocząć proces ręcznie, więc nie musisz instalować usługi i dołączać do niej w celu debugowania.