2009-06-10 8 views
105

me gustaría hacer el siguiente pero en C# en lugar de C++#ifdef en 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

Compruebe ** [esta excelente respuesta] (http://stackoverflow.com/a/43442076/1016343) ** también, muestra cómo puede agregar símbolos de depuración en función de las condiciones a través del archivo de proyecto (.csproj) . – Matt

+0

@Matt: A menudo creo que SO debería archivar/retirar viejas preguntas. –

Respuesta

42

#if será su nuevo amigo, creo.

Si desea definir sus propios símbolos de compilación personalizados, puede hacerlo en las propiedades del proyecto (en la pestaña Generar; "Símbolos de compilación condicional").

+0

HeavyD le removió unos segundos :) –

+6

+1 para vincular a la documentación. – LukeH

+1

@ acidzombie24: Sí, debes ser como Lucky Luke aquí (@Luke; sin juego de palabras ...) –

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 

Asegúrate de tener la casilla de verificación para definir DEBUG marcado en tus propiedades de compilación.

+0

Gracias: D –

41

¡Yo le recomendaría usar el Conditional Attribute!

Actualización: 3,5 años más tarde

Puede utilizar #if como esto (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 
    } 
} 

Sólo es útil para excluir partes de métodos. Si excluye algún método de la compilación, deberá excluir de la compilación todas las partes de código que también lo llaman (a veces puede cargar algunas clases en tiempo de ejecución y no puede encontrar la persona que llama con "Buscar todas las referencias "). De lo contrario, habrá errores.

Si usa la compilación condicional, por otro lado, puede dejar todos los códigos que invoquen el método. Todos los parámetros aún serán validados por el compilador. El método simplemente no se llamará en el tiempo de ejecución. Creo que es mucho mejor ocultar el método solo una vez y no tener que eliminar todo el código que lo llama también. No está permitido usar el atributo condicional en métodos que devuelven valor, solo en métodos vacíos. Pero no creo que esto sea una gran limitación porque si usa #if con un método que devuelve un valor, debe ocultar todos los códigos que lo llamen también.

Aquí es un ejemplo:

 

    // 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"); 
     } 
    } 

Resumen:

me gustaría utilizar #ifdef en C++, pero con C#/VB me gustaría utilizar atributo condicional. De esta manera, ocultas la definición del método sin tener que ocultar los fragmentos de código que lo llaman. El compilador todavía compila y valida el código de llamada; sin embargo, el método no se llama en el tiempo de ejecución. Es posible que desee utilizar #if para evitar dependencias porque con el atributo Condicional su código aún se compila.

+1

+1 Esto es muy bueno, pero tiene limitaciones, como cuando intentas devolver un valor de un método condicional (como yo lo entiendo). Un ejemplo en línea ayudaría, creo. –

+1

Tampoco impide que el código se compile, simplemente no permite ese código. La distinción es importante cuando desea eliminar dependencias y tal. –

+1

... y sigue siendo útil 3 años después de su actualización – KornMuffin

1

C# tiene un preprocesador. Funciona de forma ligeramente diferente que de C++ y C.

Aquí hay un enlace de MSDN - la sección en all preprocessor directives.

+10

Es un punto menor, pero C# NO tiene un preprocesador. # directivas son procesadas por el compilador principal como si hubiera un preprocesador. Vea aquí: http://msdn.microsoft.com/en-us/library/ed8yd1ha.aspx El principal resultado de esta distinción es que las macros de estilo c/C++ no funcionan. –

Cuestiones relacionadas