#ifdef w C #

116

Chciałbym wykonać poniższe czynności, ale w C # zamiast w C ++

#ifdef _DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif

źródło
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 DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif

Upewnij się, że masz zaznaczone pole wyboru DEBUG we właściwościach kompilacji.

ciężki
źródło
51

Zalecałbym użycie atrybutu warunkowego !

Aktualizacja: 3,5 roku później

Możesz użyć w #iften sposób ( przykład skopiowany z MSDN ):

// preprocessor_if.cs
#define DEBUG
#define VC_V7
using System;
public class MyClass 
{
    static void Main() 
    {
#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");
#else
        Console.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.

Pavel Nikolov
źródło
1
+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.

Oto linki MSDN - sekcja dotycząca wszystkich dyrektyw preprocesora .

Karl T.
źródło
11
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ą.
Simon P Stevens