Ich möchte das Folgende tun, aber in C # anstelle von 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
Ich möchte das Folgende tun, aber in C # anstelle von 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
Antworten:
Ich würde Ihnen empfehlen, das bedingte Attribut zu verwenden !
Update: 3,5 Jahre später
Sie können Folgendes verwenden #if( Beispiel aus MSDN kopiert ):
// 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
}
}
Nur nützlich, um Teile von Methoden auszuschließen.
Wenn Sie #ifeine Methode von der Kompilierung ausschließen, müssen Sie alle Codeteile, die diese Methode ebenfalls aufrufen, von der Kompilierung ausschließen (manchmal können Sie zur Laufzeit einige Klassen laden und den Aufrufer mit "Alle Referenzen finden" nicht finden). Andernfalls treten Fehler auf.
Wenn Sie andererseits die bedingte Kompilierung verwenden, können Sie dennoch alle Codeteile belassen, die die Methode aufrufen. Alle Parameter werden weiterhin vom Compiler validiert. Die Methode wird zur Laufzeit einfach nicht aufgerufen . Ich denke, dass es viel besser ist, die Methode nur einmal auszublenden und nicht den gesamten Code zu entfernen, der sie ebenfalls aufruft. Sie dürfen das bedingte Attribut nicht für Methoden verwenden, die einen Wert zurückgeben - nur für void-Methoden. Ich denke jedoch nicht, dass dies eine große Einschränkung ist, denn wenn Sie #ifeine Methode verwenden, die einen Wert zurückgibt, müssen Sie alle Codeteile ausblenden, die ihn ebenfalls aufrufen.
Hier ist ein Beispiel:
// Der Aufruf von Class1.ConditionalMethod () wird zur Laufzeit ignoriert
// es sei denn, die DEBUG-Konstante ist definiert
using System.Diagnostics;
Klasse Klasse1
{
[Bedingt ("DEBUG")]
public static void ConditionalMethod () {
Console.WriteLine ("Executed Class1.ConditionalMethod");
}}
}}
Zusammenfassung:
Ich würde #ifdefin C ++ verwenden, aber mit C # / VB würde ich das Conditional-Attribut verwenden. Auf diese Weise können Sie die Methodendefinition ausblenden, ohne die Codeteile ausblenden zu müssen, die sie aufrufen. Der aufrufende Code wird weiterhin vom Compiler kompiliert und validiert, die Methode wird jedoch zur Laufzeit nicht aufgerufen. Möglicherweise möchten Sie verwenden #if, um Abhängigkeiten zu vermeiden, da Ihr Code mit dem Attribut "Bedingt" noch kompiliert wird.
C # hat einen Präprozessor. Es funktioniert nur geringfügig anders als das von C ++ und C.
Hier ist ein MSDN-Link - der Abschnitt über alle Präprozessor-Direktiven .