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
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
Odpowiedzi:
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.
C # ma preprocesor. Działa tylko trochę inaczej niż w C ++ i C.
Oto linki MSDN - sekcja dotycząca wszystkich dyrektyw preprocesora .