Sprawdź również tę doskonałą odpowiedź , która pokazuje, jak możesz dodać symbole debugowania na podstawie warunków za pośrednictwem pliku projektu (.csproj).
Matt
Odpowiedzi:
162
#if DEBUGbool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging#elsebool bypassCheck =false;//NEVER bypass it#endif
Upewnij się, że masz zaznaczone pole wyboru DEBUG we właściwościach kompilacji.
// preprocessor_if.cs#define DEBUG
#define VC_V7
using System;publicclassMyClass{staticvoidMain(){#if (DEBUG && !VC_V7)Console.WriteLine("DEBUG is defined");#elif(!DEBUG && VC_V7)Console.WriteLine("VC_V7 is defined");#elif(DEBUG && VC_V7)Console.WriteLine("DEBUG and VC_V7 are defined");#elseConsole.WriteLine("DEBUG and VC_V7 are not defined");#endif}}
Przydatne tylko do wykluczania części metod.
Jeśli używasz #ifdo wykluczania jakiejś metody z kompilacji, będziesz musiał wykluczyć z kompilacji wszystkie fragmenty kodu, które również wywołują tę metodę (czasami możesz załadować niektóre klasy w czasie wykonywania i nie możesz znaleźć obiektu wywołującego za pomocą opcji „Znajdź wszystkie odwołania”). W przeciwnym razie wystąpią błędy.
Z drugiej strony, jeśli używasz kompilacji warunkowej, nadal możesz pozostawić wszystkie fragmenty kodu, które wywołują metodę. Wszystkie parametry będą nadal sprawdzane przez kompilator. Metoda po prostu nie zostanie wywołana w czasie wykonywania . Myślę, że o wiele lepiej jest ukryć metodę tylko raz i nie trzeba usuwać całego kodu, który ją również wywołuje. Nie możesz używać atrybutu warunkowego w metodach, które zwracają wartość - tylko w metodach void. Ale nie sądzę, żeby to było duże ograniczenie, ponieważ jeśli używasz #ifz metodą, która zwraca wartość, musisz ukryć wszystkie fragmenty kodu, które ją wywołują.
Oto przykład:
// wywołanie Class1.ConditionalMethod () zostanie zignorowane w czasie wykonywania
// chyba że zdefiniowano stałą DEBUG
using System.Diagnostics;
klasa Class1
{
[Warunkowo („DEBUG”)]
public static void ConditionalMethod () {
Console.WriteLine ("Wykonano Class1.ConditionalMethod");
}
}
Podsumowanie:
Użyłbym #ifdefw C ++, ale z C # / VB użyłbym atrybutu warunkowego. W ten sposób ukryjesz definicję metody bez konieczności ukrywania fragmentów kodu, które ją wywołują. Kod wywołujący jest nadal kompilowany i sprawdzany przez kompilator, jednak metoda nie jest wywoływana w czasie wykonywania. Możesz chcieć użyć, #ifaby uniknąć zależności, ponieważ z atrybutem warunkowym Twój kod jest nadal kompilowany.
+1 Jest to rzeczywiście fajne, ale ma ograniczenia, na przykład gdy próbujesz zwrócić wartość z metody warunkowej (jak to rozumiem). Myślę, że pomocny byłby przykład wbudowany.
Hamish Grubijan
1
Nie zapobiega również kompilacji kodu, po prostu nie zezwala na ten kod. Rozróżnienie jest ważne, gdy chcesz usunąć zależności itp.
Lee Louviere
1
C # ma preprocesor. Działa tylko trochę inaczej niż w C ++ i C.
To drobna kwestia, ale C # NIE ma preprocesora. # dyrektywy są przetwarzane przez główny kompilator tak, jakby istniał preprocesor. Zobacz tutaj: msdn.microsoft.com/en-us/library/ed8yd1ha.aspx Głównym skutkiem tego rozróżnienia jest to, że makra w stylu c / c ++ nie działają.
Odpowiedzi:
Upewnij się, że masz zaznaczone pole wyboru DEBUG we właściwościach kompilacji.
źródło
Zalecałbym użycie atrybutu warunkowego !
Aktualizacja: 3,5 roku później
Możesz użyć w
#if
ten sposób ( przykład skopiowany z MSDN ):Przydatne tylko do wykluczania części metod.
Jeśli używasz
#if
do wykluczania jakiejś metody z kompilacji, będziesz musiał wykluczyć z kompilacji wszystkie fragmenty kodu, które również wywołują tę metodę (czasami możesz załadować niektóre klasy w czasie wykonywania i nie możesz znaleźć obiektu wywołującego za pomocą opcji „Znajdź wszystkie odwołania”). W przeciwnym razie wystąpią błędy.Z drugiej strony, jeśli używasz kompilacji warunkowej, nadal możesz pozostawić wszystkie fragmenty kodu, które wywołują metodę. Wszystkie parametry będą nadal sprawdzane przez kompilator. Metoda po prostu nie zostanie wywołana w czasie wykonywania . Myślę, że o wiele lepiej jest ukryć metodę tylko raz i nie trzeba usuwać całego kodu, który ją również wywołuje. Nie możesz używać atrybutu warunkowego w metodach, które zwracają wartość - tylko w metodach void. Ale nie sądzę, żeby to było duże ograniczenie, ponieważ jeśli używasz
#if
z metodą, która zwraca wartość, musisz ukryć wszystkie fragmenty kodu, które ją wywołują.Oto przykład:
Podsumowanie:
Użyłbym
#ifdef
w C ++, ale z C # / VB użyłbym atrybutu warunkowego. W ten sposób ukryjesz definicję metody bez konieczności ukrywania fragmentów kodu, które ją wywołują. Kod wywołujący jest nadal kompilowany i sprawdzany przez kompilator, jednak metoda nie jest wywoływana w czasie wykonywania. Możesz chcieć użyć,#if
aby uniknąć zależności, ponieważ z atrybutem warunkowym Twój kod jest nadal kompilowany.źródło
C # ma preprocesor. Działa tylko trochę inaczej niż w C ++ i C.
Oto linki MSDN - sekcja dotycząca wszystkich dyrektyw preprocesora .
źródło