2011-07-31 8 views
7

Wygląda na to, że byłoby idealne (pod względem czytelności) użycie na przykład Debug.WriteLine, aby pisać na wyjściu zamiast na tonie instrukcji #if DEBUG.C# Czy instrukcje debugowania są kompilowane podczas pracy w trybie Release?

Gdy program jest kompilowany w trybie zwolnienia, czy cały narzut z numerem Debug.WriteLine znika, jakby go nie było, lub czy funkcja jest nadal wywoływana, ale nic nie dzieje się wewnętrznie?

Jeśli tak, to czy istnieje sposób uzyskania tej funkcji w klasie niestandardowej, tj. Połączenie statyczne byłoby kompilowane tylko wtedy, gdy jesteśmy w trybie debugowania?

Odpowiedz

14

Nazywa się ConditionalAttribute i już tam jest: Debug.WriteLine() połączenia są całkowicie usuwane podczas kompilacji w trybie Release.

To jest zadeklarowana następująco:

[ConditionalAttribute("DEBUG")] 
public static void WriteLine(string message) 

więc wszelkie rozmowy do niego są usuwane jeśli DEBUG symbol nie jest zadeklarowana, na przykład, w domyślnej konfiguracji kompilacji uwalniania. (Można zmienić symbole pre-procesora zdefiniowane dla różnych konfiguracji kompilacji we właściwościach projektu.)

To samo dotyczy (prawie?) Każdej metody w Debug. W rzeczywistości jest to główna różnica między metodami Debug i Trace - także w wersji.

+2

Nie jest to odpowiedź, ale nawet jeśli nie wiesz o atrybucie warunkowym i wprowadzisz całą metodę do #v oraz debugowania, zostanie ona zoptymalizowana. http://stackoverflow.com/questions/11783/in-net-will-empty-method-calls-be-optimized-out –

+2

@mootinator: Cóż, to nie to samo. Z 'Coditional' wszystko jest wyrzucane w czasie kompilacji. Przy pustej metodzie JITter musi jeszcze analizować rzeczy w czasie wykonywania, zmniejszając w ten sposób wydajność. W każdym razie niewiele. W ten sposób JITter nigdy nie zobaczyłby tej metody. –

+0

Należy pamiętać, że jeśli wykonasz jakąś szaloną konkatenację ciągów przed przekazaniem jej do Debug.Write/WriteLine, twoja konkatenacja ciągów zostanie uwzględniona w twojej kompilacji wydania. Jeśli umieścisz logikę konkatenacji wewnątrz funkcji, zostanie ona usunięta. Więc możesz zrobić konkatencję łańcuchową jak: Debug.WriteLine (DoHugeStringCalculation()); ..w przeciwnym razie możesz użyć #if DEBUG wokół tego wszystkiego. –

Powiązane problemy