test sentencia lenguaje funciona else ejemplos como c# debugging release

sentencia - Directrices C#if/then para depuración vs lanzamiento



lenguaje c if else ejemplos (12)

En las propiedades de la Solución, tengo la Configuración configurada para "liberar" para mi único proyecto.

Al comienzo de la rutina principal, tengo este código y se muestra "Modo = Depurar". También tengo estas dos líneas en la parte superior:

#define DEBUG #define RELEASE

¿Estoy probando la variable correcta?

#if (DEBUG) Console.WriteLine("Mode=Debug"); #elif (RELEASE) Console.WriteLine("Mode=Release"); #endif

Mi objetivo es establecer diferentes valores predeterminados para las variables en función del modo de depuración vs versión.


Asegúrese de definir la constante DEBUG en las propiedades de compilación del proyecto. Esto habilitará el #if DEBUG . No veo una constante de LIBERACIÓN predefinida, por lo que eso podría implicar que cualquier cosa que No esté en un bloque DEBUG es el modo LIBERAR.


Dado que el propósito de estas directivas de COMPILER es decirle al compilador que NO incluya código, código de depuración, código beta o tal vez el código que necesiten todos sus usuarios finales, excepto el departamento de publicidad, es decir, #Define AdDept que desea Poder incluirlos o eliminarlos en función de sus necesidades. Sin tener que cambiar su código fuente si, por ejemplo, un AdDept no se fusiona con el AdDept. Entonces, todo lo que hay que hacer es incluir la directiva #AdDept en la página de propiedades de opciones del compilador de una versión existente del programa y hacer una compilación y wa la! El código del programa fusionado saldrá vivo !.

También es posible que desee utilizar un declarativo para un nuevo proceso que no esté listo para el horario de máxima audiencia o que no pueda estar activo en el código hasta que sea el momento de liberarlo.

De todos modos, esa es la forma en que lo hago.


De forma predeterminada, Visual Studio define DEBUG si el proyecto se compila en modo Debug y no lo define si está en modo Release. RELEASE no está definido en modo Release por defecto. Usa algo como esto:

#if DEBUG // debug stuff goes here #else // release stuff goes here #endif

Si quieres hacer algo solo en modo release:

#if !DEBUG // release... #endif

Además, vale la pena señalar que puede usar el atributo [Conditional("DEBUG")] en los métodos que devuelven el void para que solo se ejecuten si se define un determinado símbolo. El compilador eliminaría todas las llamadas a esos métodos si el símbolo no está definido:

[Conditional("DEBUG")] void PrintLog() { Console.WriteLine("Debug info"); } void Test() { PrintLog(); }


Elimine #define DEBUG en su código. Establezca preprocesadores en la configuración de compilación para esa compilación específica (DEBUG / _DEBUG ya debe estar definido en VS).

La razón por la que se imprime "Mode = Debug" es debido a su #define y luego se salta el elif .

Además, la forma correcta de comprobarlo es:

#if DEBUG Console.WriteLine("Mode=Debug"); #else Console.WriteLine("Mode=Release"); #endif

No compruebe la LIBERACIÓN


Espacio de nombres

using System.Resources; using System.Diagnostics;

Método

private static bool IsDebug() { object[] customAttributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(DebuggableAttribute), false); if ((customAttributes != null) && (customAttributes.Length == 1)) { DebuggableAttribute attribute = customAttributes[0] as DebuggableAttribute; return (attribute.IsJITOptimizerDisabled && attribute.IsJITTrackingEnabled); } return false; }


No soy un gran fanático de las cosas de #if, especialmente si lo distribuyes por la base de tu código, ya que te dará problemas en el proceso de las versiones de depuración, pero las versiones de la versión fallan si no tienes cuidado.

Así que esto es lo que he encontrado (inspirado por #ifdef en C # ):

public interface IDebuggingService { bool RunningInDebugMode(); } public class DebuggingService : IDebuggingService { private bool debugging; public bool RunningInDebugMode() { //#if DEBUG //return true; //#else //return false; //#endif WellAreWe(); return debugging; } [Conditional("DEBUG")] private void WellAreWe() { debugging = true; } }


Prefiero comprobarlo de esta manera vs buscando #defines:

if (System.Diagnostics.Debugger.IsAttached) { //... } else { //... }

Con la advertencia de que, por supuesto, puede compilar e implementar algo en el modo de depuración pero no tener el depurador adjunto.


Quita tus define en la parte superior.

#if DEBUG Console.WriteLine("Mode=Debug"); #else Console.WriteLine("Mode=Release"); #endif


Si está intentando usar la variable definida para el tipo de compilación, debe eliminar las dos líneas ...

#define DEBUG #define RELEASE

... esto hará que el #if (DEBUG) sea ​​siempre verdadero.

Además, no hay un símbolo de compilación condicional predeterminado para RELEASE . Si desea definir una, vaya a las propiedades del proyecto, haga clic en la pestaña Generar y luego agregue LIBERAR al cuadro de texto de símbolos de compilación Condicional debajo del encabezado General .

La otra opción sería hacer esto ...

#if DEBUG Console.WriteLine("Debug"); #else Console.WriteLine("Release"); #endif


Una sugerencia que puede ahorrarle mucho tiempo, no olvide que incluso si elige debug en la configuración de compilación (en el menú vs2012 / 13 está en BUILD => ADMINISTRADOR DE CONFIGURACIÓN), eso no es suficiente.

Debe prestar atención a la Configuration PUBLISH, como tal:


Versión ligeramente modificada (¿bastarda?) De la respuesta de Tod Thomson como una función estática en lugar de una clase separada (quería ser capaz de llamarlo en un enlace de visualización de WebForm desde una clase de viewutils que ya había incluido).

public static bool isDebugging() { bool debugging = false; WellAreWe(ref debugging); return debugging; } [Conditional("DEBUG")] private static void WellAreWe(ref bool debugging) { debugging = true; }


bool isDebug = false; Debug.Assert(isDebug = true); // ''='', not ''==''

El método Debug.Assert tiene el atributo condicional DEBUG . Si no está definido, la llamada y la asignación isDebug = true se eliminated :

Si se define el símbolo, se incluye la llamada; de lo contrario, se omite la llamada (incluida la evaluación de los parámetros de la llamada).

Si se define DEBUG , isDebug se establece en true (y se pasa a Debug.Assert , que no hace nada en ese caso).