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
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
#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").
Pesante barbabietola di pochi secondi :) –
+1 per il collegamento alla documentazione. – LukeH
@ acidzombie24: Sì, devi essere come Lucky Luke qui (@Luke; no pun intended ...) –
#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.
Grazie: D –
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 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. –
Inoltre, non impedisce la compilazione del codice, semplicemente non consente tale codice. La distinzione è importante quando si desidera rimuovere le dipendenze e così via. –
... e ancora utile 3 anni dopo l'aggiornamento – KornMuffin
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.
È 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. –
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
@Matt: Spesso penso che SO dovrebbe archiviare/ritirare vecchie domande. –