2010-10-05 21 views
5

estoy siguiendo este tutorial:¿cómo es #if/#endif diferente que si?

 static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      int i = 1; 
      while (true) 
      { 
#if TEST 
      if (i % 2 == 0) 
       continue; 
#endif 
       i++; 
       Console.WriteLine("The value of i is {0}", i); 
       if (i > 9) 
        break; 
      } 
      Console.WriteLine("The value of i is {0}", i); 

      Application.Run(new Form1()); 
     } 

¿cuál es el propósito de utilizar #if TEST en lugar de sólo if(TEST) ??

+0

Aquí hay una pregunta relacionada: http://stackoverflow.com/questions/15744/how-do-you-use-define –

Respuesta

3

Es útil cuando necesita dos (o más) versiones de su código con poca diferencia. Luego, en lugar de mantener dos proyectos usando directivas de compilación como #if TEST, escribe ambas versiones en el mismo proyecto. Luego, desde las propiedades del proyecto puede establecer el valor de TEST llike TEST = true y luego compilar el proyecto.

#if TEST 
    Console.WriteLine("Hello World!"); 
#else 
    Console.WriteLine("Goodbye World!"); 
#endif 

Si TEST = true es como se acaba de escribir: Console.WriteLine("Hello World!"); y viceversa.

16

Porque el uso de #IF determinará si el código está compilado o no.

El uso de if determinará si el código se ejecuta o no.

Parece que hay una PRUEBA de "entorno" definida en tiempo de compilación. Así que si existe ese ambiente, la

if (i % 2 == 0) 
continue; 

se pondrá a prueba y ejecutados: Sólo se imprimirán los números impares.

Lo importante es que el código compilado cambia según la existencia de TEST. En un "entorno SIN PRUEBAS" el

if (i % 2 == 0) 
continue; 

ni siquiera existirá cuando se ejecute la aplicación.

¿Cuál es el propósito de usar #IF TEST en lugar de simplemente si (TEST)?

TEST no es una variable, ni una constante. Ni siquiera existe en tiempo de ejecución. Es un indicador pasado al compilador para que pueda decidir compilar algún código (es decir, ponerlo en el ejecutable)

Quizás sería más claro si la directiva #if tuviera algo más adentro. Permite modificar el fragmento a esto:

#if TEST 
      if (i == 5) 
       System.exit(1)//Not a c# programmer; 
#endif 

En este caso, en virtud de la existencia de TEST, el programa solo bucle 5 veces. En cada iteración, i se probará contra 5. ¡¡¡Espera un minuto!!! ¡Ni siquiera compilará!

Si TEST no está definido, la aplicación continuará hasta que se alcance otra condición de salida. No se realizará ninguna comparación de i con 5. Leer más en directivas here:

#if, junto con el #else, #elif, #endif, #define y directivas #undef, le permite incluir o excluir código basado en la existencia de una o más símbolos Esto puede ser útil al compilar el código para una compilación de depuración o al compilar para una configuración específica de .

3

Estas son las constantes del compilador, por ejemplo:

#if DEBUG 
    Debug.WriteLine("This is written in debug mode"); 
#endif 

Si se define la constante DEBUG, ese código se compila, si no es así entonces se quitó, ignorado por el compilador ..es una forma de determinar qué hay en un determinado tipo de construcción y desmantelar para otro.

Es usualmente usado para declaraciones de tipo de depuración adicionales, pero es lo suficientemente extensible como para tener muchas aplicaciones, código de prueba en su caso.

2

Significa que si ha definido la variable de preprocesador TEST y tiene un valor distinto de cero, el código se compilará en el programa resultante. Se puede definir TEST poniendo

 
#define TEST 1 

en su programa antes de la declaración #if a haber ese código compilado.

si (TEST) se expandirá en si (1) si ha definido prueba de que el anterior.

+0

No del todo - esto es C#, que no tiene un preprocesador y no le permite para # definir valores como ese. Sin embargo, puede definir símbolos como parte de su configuración de compilación, en cuyo caso '#if TEST' actúa como' #ifdef TEST' en C/C++. –

+1

Hmm ... ese # parece un ++ a un tamaño de letra tan pequeño :) –

1

De MSDN:

Cuando el compilador de C# se encuentra con una directiva #if , seguido finalmente por una directiva #endif , se compilará el código entre las directivas solo si se define el símbolo especificado. .. la instrucción #if en C# es booleana y solo prueba si el símbolo se ha definido o no.

1

Lo que está viendo es el lenguaje de macros que está escrito para el compilador. Si el compilador está funcionando en modo de TEST, incluirá las líneas

if (i % 2 == 0) 
continue; 

de lo contrario no lo hará.

Estos valores se suelen definir en las propiedades de su proyecto. Simplemente haga clic derecho en su proyecto y seleccione "Propiedades", luego "Compilación" (trabajando desde la memoria, aquí;))

Cuestiones relacionadas