2009-06-10 15 views
105

vorrei fare il seguito, ma in C# invece di C++#ifdef in 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 
+0

Controlla ** [questa risposta eccellente] (http://stackoverflow.com/a/43442076/1016343) ** e mostra come puoi aggiungere i simboli di debug in base alle condizioni tramite il file di progetto (.csproj) . – Matt

+0

@Matt: Spesso penso che SO dovrebbe archiviare/ritirare vecchie domande. –

risposta

42

#if sarà il vostro nuovo amico, credo.

Se si desidera definire i propri simboli di compilazione personalizzati, è possibile farlo nelle proprietà del progetto (nella scheda Crea; "Simboli di compilazione condizionale").

+0

Pesante barbabietola di pochi secondi :) –

+6

+1 per il collegamento alla documentazione. – LukeH

+1

@ acidzombie24: Sì, devi essere come Lucky Luke qui (@Luke; no pun intended ...) –

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

Assicurarsi di avere la casella di controllo per definire DEBUG controllato nelle proprietà di compilazione.

+0

Grazie: D –

41

Si consiglia di utilizzare il Conditional Attribute!

Aggiornamento: 3,5 anni dopo

È possibile utilizzare #if come questo (example copied from 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 
    } 
} 

solo utile per escludere parti di metodi.

Se si utilizza #if per escludere alcuni metodi dalla compilazione, sarà necessario escludere dalla compilazione tutti i pezzi di codice che chiamano tale metodo (a volte è possibile caricare alcune classi in fase di esecuzione e non è possibile trovare il chiamante con "Trova tutti i riferimenti "). Altrimenti ci saranno errori.

Se si utilizza la compilazione condizionale, d'altra parte è comunque possibile lasciare tutti i pezzi di codice che chiamano il metodo. Tutti i parametri saranno ancora convalidati dal compilatore. Il metodo non sarà chiamato in fase di esecuzione. Penso che sia meglio nascondere il metodo una sola volta e non dover rimuovere anche tutto il codice che lo chiama. Non è consentito utilizzare l'attributo condizionale su metodi che restituiscono valore, solo sui metodi void. Ma non penso che questo sia un grosso limite perché se usi #if con un metodo che restituisce un valore devi nascondere tutti i pezzi di codice che lo chiamano anche tu.

Ecco un esempio:

 

    // calling Class1.ConditionalMethod() will be ignored at runtime 
    // unless the DEBUG constant is defined 


    using System.Diagnostics; 
    class Class1 
    { 
     [Conditional("DEBUG")] 
     public static void ConditionalMethod() { 
      Console.WriteLine("Executed Class1.ConditionalMethod"); 
     } 
    } 

Sommario:

userei #ifdef in C++, ma con C#/VB Vorrei usare l'attributo condizionale. In questo modo si nasconde la definizione del metodo senza dover nascondere i pezzi di codice che lo chiamano. Il codice chiamante è ancora compilato e convalidato dal compilatore, tuttavia il metodo non viene richiamato in fase di runtime. Si consiglia di utilizzare #if per evitare le dipendenze perché con l'attributo Condizionale il codice è ancora compilato.

+1

+1 Questo è davvero bello, ma presenta delle limitazioni, ad esempio quando si tenta di restituire un valore da un metodo condizionale (come ho capito). Un esempio in linea aiuterebbe, penso. –

+1

Inoltre, non impedisce la compilazione del codice, semplicemente non consente tale codice. La distinzione è importante quando si desidera rimuovere le dipendenze e così via. –

+1

... e ancora utile 3 anni dopo l'aggiornamento – KornMuffin

1

C# ha un preprocessore. Funziona in modo leggermente diverso rispetto a quello di C++ e C.

Ecco un collegamento MSDN: la sezione su all preprocessor directives.

+10

È un punto secondario, ma C# NON ha un preprocessore. Le direttive # vengono elaborate dal compilatore principale come se esistesse un preprocessore. Vedere qui: http://msdn.microsoft.com/en-us/library/ed8yd1ha.aspx Il risultato principale di questa distinzione è che le macro di stile c/C++ non funzionano. –

Problemi correlati