Verifique esta excelente respuesta también, muestra cómo puede agregar símbolos de depuración según las condiciones a través del archivo del proyecto (.csproj).
Matt
Respuestas:
162
#if DEBUGbool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging#elsebool bypassCheck =false;//NEVER bypass it#endif
Asegúrese de tener marcada la casilla de verificación para definir DEBUG en sus propiedades de compilación.
// preprocessor_if.cs#define DEBUG
#define VC_V7
using System;publicclassMyClass{staticvoidMain(){#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");#elseConsole.WriteLine("DEBUG and VC_V7 are not defined");#endif}}
Solo es útil para excluir partes de métodos.
Si utiliza #ifpara excluir algún método de la compilación, tendrá que excluir de la compilación todas las piezas de código que también llaman a ese método (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, aún puede dejar todos los fragmentos de código que llaman al método. Todos los parámetros aún serán validados por el compilador. El método simplemente no se llamará en 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 se le permite usar el atributo condicional en métodos que devuelven valor, solo en métodos nulos. Pero no creo que esto sea una gran limitación porque si usa #ifcon un método que devuelve un valor, debe ocultar todos los fragmentos de código que lo llaman también.
Aquí hay un ejemplo:
// llamar a Class1.ConditionalMethod () será ignorado en tiempo de ejecución
// a menos que se defina la constante DEBUG
utilizando System.Diagnostics;
clase Class1
{
[Condicional ("DEBUG")]
public static void ConditionalMethod () {
Console.WriteLine ("Class1.ConditionalMethod ejecutado");
}
}
Resumen:
Usaría #ifdefen C ++ pero con C # / VB usaría el atributo condicional. De esta forma, oculta la definición del método sin tener que ocultar los fragmentos de código que lo llaman. El compilador aún compila y valida el código de llamada, aunque el método no se llama en tiempo de ejecución. Es posible que desee utilizar #ifpara evitar dependencias porque con el atributo Condicional su código todavía está compilado.
+1 Esto es realmente bueno, pero tiene limitaciones, como cuando intentas devolver un valor de un método condicional (según tengo entendido). Un ejemplo en línea ayudaría, creo.
Hamish Grubijan
1
Tampoco evita que se compile el código, simplemente no permite ese código. La distinción es importante cuando desea eliminar dependencias y demás.
Lee Louviere
1
C # tiene un preprocesador. Funciona de forma ligeramente diferente a la de C ++ y C.
Es un punto menor, pero C # NO tiene un preprocesador. # Las directivas son procesadas por el compilador principal como si hubiera un preprocesador. Vea aquí: msdn.microsoft.com/en-us/library/ed8yd1ha.aspx El resultado principal de esta distinción es que las macros de estilo c / c ++ no funcionan.
Respuestas:
Asegúrese de tener marcada la casilla de verificación para definir DEBUG en sus propiedades de compilación.
fuente
¡Te recomendaría que uses el atributo condicional !
Actualización: 3,5 años después
Puede usarlo
#if
así ( ejemplo copiado de MSDN ):Solo es útil para excluir partes de métodos.
Si utiliza
#if
para excluir algún método de la compilación, tendrá que excluir de la compilación todas las piezas de código que también llaman a ese método (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, aún puede dejar todos los fragmentos de código que llaman al método. Todos los parámetros aún serán validados por el compilador. El método simplemente no se llamará en 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 se le permite usar el atributo condicional en métodos que devuelven valor, solo en métodos nulos. 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 fragmentos de código que lo llaman también.Aquí hay un ejemplo:
Resumen:
Usaría
#ifdef
en C ++ pero con C # / VB usaría el atributo condicional. De esta forma, oculta la definición del método sin tener que ocultar los fragmentos de código que lo llaman. El compilador aún compila y valida el código de llamada, aunque el método no se llama en tiempo de ejecución. Es posible que desee utilizar#if
para evitar dependencias porque con el atributo Condicional su código todavía está compilado.fuente
C # tiene un preprocesador. Funciona de forma ligeramente diferente a la de C ++ y C.
Aquí hay enlaces de MSDN: la sección sobre todas las directivas del preprocesador .
fuente