2010-05-18 20 views

Respuesta

22

en modo de depuración:

#if DEBUG 
      System.Console.WriteLine("Debug version"); 
#endif 
      System.Console.WriteLine("Output"); 

de salida como

Debug version 
Output 

En el modo de salida:

#if DEBUG 
      System.Console.WriteLine("Debug version"); 
#endif 
      System.Console.WriteLine("Output"); 

de salida como

Output 

leyeron: #if (C# Reference)

Uso: Si usted tiene un conjunto de valores para ser probado en el modo de depuración y no en el modo de liberación puede utilizar #if DEBUG

5

No tiene que usarlo en absoluto. El propósito de esto es tener secciones de código que solo se compilan en modo de depuración. p.ej. Es posible que tenga algún código que habilite a un usuario maestro, que podría pretender ser cualquier otro usuario en el sistema para probar y depurar los objetivos. No querría que el usuario esté habilitado en el código de lanzamiento por razones de seguridad, por lo que podría envolver las secciones relevantes del código en #if DEBUG y se excluirían del código de lanzamiento.

+2

O, simplemente, no se mostrará la pantalla de bienvenida al depurar , ahorrando un segundo o dos. Cosas como esas. – TomTom

+2

@TomTom: ¿qué tal, no muestres la pantalla de bienvenida * ever *? – MusiGenesis

5

Al compilar, puede establecer indicadores de compilación que puede usar para poner el código en esas directivas. Ese código no se compilará y nunca terminará en el resultado del ensamblaje final. DEBUG es uno de los predefinidos, pero puede usar el suyo.

Como ejemplo de uso: en uno de los desarrollos actuales usamos un indicador de compilador para indicar si se debe utilizar una máscara de inicio de sesión para iniciar sesión en un usuario o si el inicio de sesión debe realizarse automáticamente con el principal actual. El segundo modo es solo para los desarrolladores, p. depurar más rápido sin tener que iniciar sesión.

Otro ejemplo: en algún código mono, verá banderas. En este caso, el código se puede compilar de manera diferente cuando, p. apuntar a un marco diferente, ya que utiliza clases que pueden no existir en versiones anteriores.

Relacionados con esto es el Condicional -Atributo con el que puede marcar un método. Si dicho indicador no está configurado, las llamadas al método no se realizarán. El método aún termina en IL, pero las llamadas se eliminarán.

Comprobar por ejemplo siguiente código:

var mthods = typeof (Debug).GetMethods().Where(mi => mi.Name.Equals("WriteLine")).ToList(); 
var attribs = mthods[0].GetCustomAttributes(true); 

Usted se dará cuenta de que el método Debug.WriteLine tiene el atributo condicional que se le aplica: Las llamadas a que se eliminará cuando se compila sin el indicador de depuración del compilador.

17

Es posible que se sienta más cómodo con el atributo Conditional, que puede ser utilizado para excluir métodos enteras, sin necesidad de complicar la fuente con los condicionales en el lado llamante:

[Conditional("DEBUG")] 
void Foo() 
{ 
} 

Foo() se puede llamar de forma segura, tanto en depurar y liberar - sin embargo, en el modo de lanzamiento, sería un no-op.

+0

¿Qué es un 'no-op'? – gingerbreadboy

+7

Es un comando especial de IL que básicamente dice "no hacer nada". Es especialmente útil cuando coloca puntos de interrupción en lugares donde no ocurre nada (por ejemplo, un corchete abierto), de esa manera el depurador puede sincronizar el código y ejecuta IL – flq

+1

+1 para no-op. bellamente explicado ... –

3

también es útil al probar servicios de Windows. Puede poner #if DEPURAR para iniciar su proceso manualmente, para que no tenga que instalar el servicio y adjuntarlo a la depuración.

Cuestiones relacionadas