Estas directivas deben comenzar con el símbolo #, y no contienen el habitual punto y coma al final de la línea, ya que no son declaraciones, por lo que se terminan con una nueva línea.
Aquí está la lista de preprocesadores.
- #Si
- #else
- #elif
- #endif
- #definir
- #undef
- #advertencia
- #error
- #línea
- #región
- #endregion
- #pragma
- #pragma warning
- #pragma checksum
Ahora vamos a echar un vistazo a lo que significa cada una de estas directivas. Si está familiarizado con el bash scripting, o la programación en C, estos conceptos le resultarán inquietantemente familiares.
#Si, si, si, si, si, si, si…
Estas son directivas condicionales. La directiva #if siempre está incluida en la directiva #endif, y entre ellas se pueden definir diferentes construcciones. Éstas pueden ser inicialización condicional de otros componentes basados en argumentos, o básicamente cualquier cosa que su aplicación necesite. Puede afinar más sus construcciones con las directivas #else y #elif condicionales.
Está permitido usar los operadores == o != para comprobar sólo los valores de bool de verdadero o falso.
Veamos un ejemplo de esto en acción. La suposición a partir de ahora es que tienes instalado el Visual Studio.
Comienza con el siguiente código.
123456789101112131415161718192021usando Sistema;usando Sistema.Colecciones.Genéricas;usando Sistema.Linq;usando Sistema.Texto;usando Sistema.Hilo.Tareas;espacio de nombres {classProgram{estaticvoidMain(string[] args){#si Sistema DEBUG. Console.WriteLine("Los preprocesadores son geniales, funcionan en modo de depuración!");#else System.Console.WriteLine("Los preprocesadores siguen siendo geniales, incluso si no estás depurando!");#endif System.Console.ReadKey();}}}
csharp
Tienes dos opciones para construir y ejecutar la solución: o la ejecutas en modo LIBERACIÓN o en modo DEBUGAR. Por defecto se ejecuta el modo DEBUG, y se produce esta salida.
Si cambias esto para que funcione en modo LIBERACIÓN, obtienes la siguiente salida.
1Los preprocesadores siguen siendo geniales, incluso si no están depurando!
bash
Observe cómo la funcionalidad extra puede ser añadida a nuestra aplicación y es recogida dinámicamente durante el preprocesamiento.
#define, #undef
Estas directivas pueden utilizarse para definir e indefinir las directivas para los preprocesadores. El caso de uso más común para esto es cuando se desea definir condiciones extra para la compilación misma. Esto se hace normalmente en tándem con la directiva #if para proporcionar una experiencia de compilación más sofisticada. Si no quieres ensuciar tu código con la directiva #define, tienes la opción de usar el argumento -define al compilador para hacer lo mismo. Esto realmente depende de su aplicación y situación. Ambos tienen sus ventajas y desventajas.
Nuestra tarea es crear una configuración de construcción basada en niveles con la ayuda de preprocesadores. Tenemos tres niveles diferentes: PROD, TEST y DEV. Las reglas dicen que NO queremos que TRACE y DEBUG estén habilitados cuando se construye para PROD. Sólo queremos que DEBUG esté habilitado cuando se construya para TEST, y queremos que tanto DEBUG como TRACE estén habilitados cuando se construya para DEV.
Aquí está nuestro código de demostración para eso.
123456789101112131415161718192021222324252627282930313233343536373839404142#define DEV#if PROD#undef DEBUG#undef TRACE#endif#if TEST#undef TRACE#endif#if DEV#define DEBUG#define TRACE#endifusing System;namespace {classProgram{estaticvoidMain(string[] args){#if PROD System. Console.WriteLine("El objetivo es PROD!");#elif TEST System.Console. WriteLine("El objetivo es TEST");#elif DEV System.Console.WriteLine("El objetivo es DEV");#endif#if DEBUG System.Console.WriteLine("DEBUG is ENABLED!");#else System.Console. WriteLine("DEBUG is DISABLED!");#endif#if TRACE System.Console.WriteLine("TRACE is ENABLED!");#else System.Console.WriteLine("TRACE is DISABLED!");#endif System.Console.ReadKey();}}}
csharp
Hay una regla que dice que no se pueden definir o definir directivas después de la primera ficha de una línea. Esto sólo significa que tienes que poner todas tus directivas en relación con esto antes que el resto del código.
Al ejecutar el código tal y como está ahora con los ajustes DEV, verá que se produce la siguiente salida.
Si cambias la primera línea por #definir TEST, verás la siguiente salida.
Cambiando a #definir PROD producirá la siguiente salida.
Esto se puede mejorar aún más eliminando el primer like y luego simplemente pasando el -define como argumento de línea de comandos al compilador.
#advertencia, #error
Estas directivas le permiten emitir una advertencia o un mensaje de error de terminación. Cuando se emite una advertencia, sólo estará presente en los registros de la consola, pero el nivel de error romperá la compilación. Esto es extremadamente útil cuando se quiere advertir al usuario sobre dependencias obsoletas o evitar la construcción de una solución incompleta que se termina con su mensaje de error personalizado.
Modifiquemos nuestro ejemplo anterior para que el proceso de compilación se rompa si el Tier no se define o se pasa como un parámetro hardcoded en nuestro script!
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#if PROD#undef DEBUG#undef TRACE#endif#if TEST#undef TRACE#endif#if DEV#define DEBUG#define TRACE#endif#if !PROD && ! TEST && !DEV#error No puede compilar ya que el nivel no está especificado#else#warning Ejecutar con información de nivel codificada duramente#endifusing System;namespace {classProgram{staticvoidMain(string[] args){#if PROD System. Console.WriteLine("El objetivo es PROD!");#elif TEST System.Console.WriteLine("El objetivo es TEST");#elif DEV System.Console.WriteLine("El objetivo es DEV");#endif#if DEBUG System.Console.WriteLine("La depuración está HABILITADA! ");#else System.Console.WriteLine("La depuración está DESHABILITADA!");#endif#if TRACE System.Console.WriteLine("El rastreo está HABILITADO!");#else System.Console.WriteLine("El rastreo está DESHABILITADO!");#endif System.Console.ReadKey();}}}
csharp
Observe cómo se eliminó la primera línea #define, y se introdujo un condicional justo encima de la declaración de uso.
Simplemente ejecutando el código de arriba resultará en este mensaje de error del cliente, rompiendo nuestra compilación.
1Error CS1029 #error: $0027No se puede compilar ya que el nivel no está especificado$0027 C:N-UsersdszaboNfuenteNde reposición.cs 15 Activo
bash
Si añadimos la primera línea de nuevo, recibiremos la siguiente advertencia.
bash
#línea
Esta directiva permite modificar la numeración de las líneas del compilador e incluso el nombre del archivo para los errores y advertencias. Hay algunas situaciones en las que se eliminan líneas específicas de los archivos de código fuente, pero es necesario que el compilador genere resultados basados en la numeración de líneas original, como los legados y la resolución de problemas. Esta directiva se usa muy raramente.
Tiene tres tipos de argumentos que puede pasar a esta directiva: por defecto, oculto y nombre de archivo. Cuando quiera que el compilador ignore la directiva, especifique hidden.
Digamos que nos gustaría modificar el nombre del archivo reportado cuando se genera una advertencia.
1234567891011121314 usando System;namespace {#line 1 "Warning line.cs "classProgram{estaticvoidMain(string[] args){#warning Warning from different filename System.Console.ReadKey();}}}
csharp
Ejecutar esto produce la siguiente salida, a pesar de cómo se nombre el archivo.
bash
#región, #región final
Esta directiva es útil cuando trabajas con el Editor de código de Visual Studio o con el propio Visual Studio. No hay ninguna salida especial de esta directiva. Te permite marcar regiones específicas, que serán expandibles y plegables por el editor que elijas. En proyectos pequeños, rara vez se ve a los desarrolladores usándola, pero en proyectos más grandes le permite agrupar partes de su código basándose en la lógica o la funcionalidad del negocio, lo que resulta útil cuando necesita añadir cosas o solucionar problemas.
Veamos el siguiente ejemplo.
1234567891011121314151617181920212223 usando System;namespace {#region AnotherClassclassAnother{privatestaticvoidDoSomething(){ System.Console.WriteLine("It$0027s something!");}}#endregion#region MainStuffclassProgram{staticvoidMain(string[] args){ System.Console.ReadKey();}}#endregion}
csharp
Insertar el código anterior en uno de los editores le dará la siguiente apariencia.
Fíjate en cómo el icono de expansión/contracción llegó a estar marcado por flechas rojas.
#pragma, #pragma warning, #pragma checksum
En palabras simples, la directiva #pragma puede ser usada para afectar la forma en que se maneja el reporte de tiempo de compilación de las advertencias y dar instrucciones especiales al compilador. Hay dos variantes básicas de advertencia y suma de comprobación. Cuando se trabaja con #pragma warning, se tiene la opción de especificar o bien desactivar o bien restaurar, seguido de una lista de advertencias sobre las que hay que actuar o nada, lo que supone todo tipo de advertencias. La suma de comprobación genera la suma de comprobación de los archivos de origen, que ayudan a depurar las páginas ASP.NET.
Por ejemplo, si se desactivaran todas las advertencias de una determinada aplicación, se podría definir esta pragmática.
1#pragma warning disable
csharp
O también podrías simplemente desactivar las advertencias específicas.
1#pragma warning disable CS3020
csharp
Si quiere, puede activar advertencias específicas si fueron desactivadas anteriormente. También puede deshacer cualquier advertencia desactivada con esta línea.
1#pragma restore
csharp
En el siguiente ejemplo, aprenderá a desactivar la advertencia «se asigna pero su valor nunca se utiliza».
123456789101112131415 usando el Sistema;namespace {#pragma warning disable 414,CS3021 classProgram{int i =1;staticvoidMain(string[] args){ System.Console.ReadKey();}}}
csharp
Ejecutar el código no produce mensajes de advertencia, pero si quitáramos la siguiente línea…
1#pragma warning disable 414, CS3021
csharp
…la siguiente advertencia aparecería.
1Aviso CS0414 El campo "Program.i" está asignado pero su valor nunca se utiliza C:N-UsersdszaboNfuente de reposición.cs 8 Activo
bash
Contenidos
- #Si, si, si, si, si, si, si…Estas son directivas condicionales. La directiva #if siempre está incluida en la directiva #endif, y entre ellas se pueden definir diferentes construcciones. Éstas pueden ser inicialización condicional de otros componentes basados en argumentos, o básicamente cualquier cosa que su aplicación necesite. Puede afinar más sus construcciones con las directivas #else y #elif condicionales.Está permitido usar los operadores == o != para comprobar sólo los valores de bool de verdadero o falso.Veamos un ejemplo de esto en acción. La suposición a partir de ahora es que tienes instalado el Visual Studio.Comienza con el siguiente código.
123456789101112131415161718192021usando Sistema;usando Sistema.Colecciones.Genéricas;usando Sistema.Linq;usando Sistema.Texto;usando Sistema.Hilo.Tareas;espacio de nombres {classProgram{estaticvoidMain(string[] args){#si Sistema DEBUG. Console.WriteLine("Los preprocesadores son geniales, funcionan en modo de depuración!");#else System.Console.WriteLine("Los preprocesadores siguen siendo geniales, incluso si no estás depurando!");#endif System.Console.ReadKey();}}}
csharpTienes dos opciones para construir y ejecutar la solución: o la ejecutas en modo LIBERACIÓN o en modo DEBUGAR. Por defecto se ejecuta el modo DEBUG, y se produce esta salida.
Si cambias esto para que funcione en modo LIBERACIÓN, obtienes la siguiente salida.
1Los preprocesadores siguen siendo geniales, incluso si no están depurando!
bashObserve cómo la funcionalidad extra puede ser añadida a nuestra aplicación y es recogida dinámicamente durante el preprocesamiento.#define, #undef
- #advertencia, #error
- #línea
- #región, #región final
- #pragma, #pragma warning, #pragma checksum
Contenidos
- #Si, si, si, si, si, si, si…Estas son directivas condicionales. La directiva #if siempre está incluida en la directiva #endif, y entre ellas se pueden definir diferentes construcciones. Éstas pueden ser inicialización condicional de otros componentes basados en argumentos, o básicamente cualquier cosa que su aplicación necesite. Puede afinar más sus construcciones con las directivas #else y #elif condicionales.Está permitido usar los operadores == o != para comprobar sólo los valores de bool de verdadero o falso.Veamos un ejemplo de esto en acción. La suposición a partir de ahora es que tienes instalado el Visual Studio.Comienza con el siguiente código. 123456789101112131415161718192021usando Sistema;usando Sistema.Colecciones.Genéricas;usando Sistema.Linq;usando Sistema.Texto;usando Sistema.Hilo.Tareas;espacio de nombres {classProgram{estaticvoidMain(string[] args){#si Sistema DEBUG. Console.WriteLine("Los preprocesadores son geniales, funcionan en modo de depuración!");#else System.Console.WriteLine("Los preprocesadores siguen siendo geniales, incluso si no estás depurando!");#endif System.Console.ReadKey();}}} csharpTienes dos opciones para construir y ejecutar la solución: o la ejecutas en modo LIBERACIÓN o en modo DEBUGAR. Por defecto se ejecuta el modo DEBUG, y se produce esta salida. Si cambias esto para que funcione en modo LIBERACIÓN, obtienes la siguiente salida. 1Los preprocesadores siguen siendo geniales, incluso si no están depurando! bashObserve cómo la funcionalidad extra puede ser añadida a nuestra aplicación y es recogida dinámicamente durante el preprocesamiento.#define, #undef
- #advertencia, #error
- #línea
- #región, #región final
- #pragma, #pragma warning, #pragma checksum