¿Funcionará #if RELEASE como #if DEBUG hace en C #?

277

En todos los ejemplos que he visto de la directiva del compilador #if, usan "DEBUG". ¿Puedo usar "RELEASE" de la misma manera para excluir el código que no quiero ejecutar cuando se compila en modo de depuración? El código que quiero rodear con este bloque envía un montón de correos electrónicos, y no quiero enviarlos accidentalmente durante las pruebas.

Brian Sullivan
fuente
3
#if !DEBUGcumple la misma función que #if RELEASEtendría. Como alternativa, #if DEBUGa continuación, #elsea continuación, #endifsi hay diferentes códigos para funcionar en los modos.
Nat

Respuestas:

275

No, no lo hará, a menos que hagas un trabajo.

La parte importante aquí es qué es realmente DEBUG, y es una especie de constante definida con la que el compilador puede verificar.

Si marca las propiedades del proyecto, en la pestaña Construir, encontrará tres cosas:

  • Un cuadro de texto llamado "Símbolos de compilación condicional"
  • Una casilla de verificación etiquetada "Definir constante DEPURACIÓN"
  • Una casilla de verificación etiquetada "Definir constante de RASTREO"

No existe tal casilla de verificación, ni constante / símbolo predefinido que tenga el nombre RELEASE.

Sin embargo, puede agregar fácilmente ese nombre al cuadro de texto etiquetado Símbolos de compilación condicional, pero asegúrese de establecer la configuración del proyecto en Modo de lanzamiento antes de hacerlo, ya que estas configuraciones son por configuración.

Básicamente, a menos que agregue eso al cuadro de texto, #if RELEASEno producirá ningún código bajo ninguna configuración.

Lasse V. Karlsen
fuente
393

RELEASE no está definido, pero puedes usar

#if (!DEBUG)
  ...
#endif
M4N
fuente
2
No lo es, pero por supuesto puedes usar el operador NOT así. No pensé en eso cuando escribí mi respuesta.
Lasse V. Karlsen
44
Lo hace, pero usar su solución es más claro y "más correcto", en mi humilde opinión.
Daniel Schaffer
1
Especialmente porque puede tener más configuraciones que solo RELEASE y DEPURACIÓN: para algunos de mis proyectos hay DEBUG, RELEASE y DEPLOY o DEV (DEBUG), TEST y PROD (RELEASE)
Adam Nofsinger
Para cualquier otra persona confundida por los comentarios anteriores, la respuesta no editada se preguntaba si RELEASEestaba definida.
Dan
41

No

Mientras que en la configuración de depuración hay una DEBUGconstante definida (definida automáticamente por Visual Studio), mientras que no hay una constante definida para el modo de lanzamiento. Verifique la configuración de su proyecto en construcción.

Seleccionando [Definir constante DEPURACIÓN] en Proyecto -> Construir es como incluir #definir DEPURACIÓN al comienzo de cada archivo.

Si desea definir una constante de LIBERACIÓN para la configuración de liberación, vaya a:

  • Propiedades del proyecto -> Construir
  • Seleccionar modo de liberación
  • en el cuadro de texto Símbolos de compilación condicional ingrese: RELEASE
Pop Catalin
fuente
1
Encontré esto muy útil ya que ahora he definido una constante de LIBERACIÓN para mi configuración de Liberación y una constante de PRUEBA para mi configuración de Prueba. Muy útil para definir requiere https solo para el lanzamiento#if (RELEASE) [RequireHttps] #endif
tekiegirl
27

En mi instalación VS (VS 2008) #if RELEASEno funciona. Sin embargo, podrías usar#if !DEBUG

Ejemplo:

#if !DEBUG
SendTediousEmail()
#endif
JaredPar
fuente
10

Nunca he visto eso antes ... pero he visto:

#if (DEBUG == FALSE)

y

#if (!DEBUG)

¿Ese trabajo para ti?

Pete H.
fuente
Los símbolos del preprocesador no tienen valores en C #; simplemente están "definidos" o "no definidos". Entonces, solo el !operador funcionará, como en su segundo ejemplo.
Jonathon Reinhart
1
Según MSDN, puede usar operadores como == para probar si es verdadero o falso. msdn.microsoft.com/en-us/library/4y6tbswk.aspx
jason_ruz
8

Puede usar #if(!DEBUG)para este propósito.

Abdus Salam Azad
fuente
Bien guardado para mí, quería usar esto en xamrian gracias por publicar.
rogue39nin
4

"Pop Catalin" lo hizo bien. Controlar la definición en función del tipo de compilación proporciona una gran flexibilidad. Por ejemplo, puede tener una configuración "DEBUG", "DEMO" y "RELEASE", todo en la misma solución. Eso evita la necesidad de programación duplicada con dos soluciones diferentes.

Entonces sí #if RELEASEo #if (RELEASE)funciona igual que #if DEBUGcuando se define el símbolo de compilación condicional RELEASE.

Lo siguiente está tomado de la publicación "Pop Catalin": Si desea definir una constante de LIBERACIÓN para la configuración de lanzamiento, vaya a: * Propiedades del proyecto -> Construir * Seleccione Modo de lanzamiento * en el cuadro de texto Símbolos de compilación condicional, ingrese: LIBERAR


fuente
2

Sé que esta es una pregunta antigua, pero vale la pena mencionar que puede crear sus propias configuraciones fuera de DEBUG y RELEASE, como TEST o UAT.

Si luego, en la pestaña Compilar de la página de propiedades del proyecto, establece los "Símbolos de compilación condicional" en PRUEBA (por ejemplo), puede usar una construcción como

#if (DEBUG || TEST )
    //Code that will not be executed in RELEASE or UAT
#endif

Puede utilizar esta construcción por razones específicas, como clientes diferentes si tiene la necesidad, o incluso métodos web completos, por ejemplo. También hemos usado esto en el pasado donde algunos comandos han causado problemas en hardware específico, por lo que tenemos una configuración para una aplicación cuando se implementa en hardware X.

Fetchez la vache
fuente
0

Puede crear sus propios símbolos de tiempo de compilación condicional (cualquier nombre que desee). Vaya al "cuadro de diálogo Generar proyecto", ubicado en el cuadro de propiedades del proyecto, opción de menú: Proyecto -> [nombre del proyecto] Propiedades ...

También puede definirlos "en la parte superior del archivo de código C #". Me gusta:

#define RELEASE
// or
#undef RELEASE

puedes usar el símbolo en una declaración #if:

#if RELEASE
// code ...
#elif 
// code ...
#endif

// or

#if !RELEASE
// code ...
#endif
King Coffee
fuente
-8

por qué no solo

#if RELEASE
#undef DEBUG
#endif
Matt Davison
fuente
3
No hay una constante llamada RELEASE definida por Visual Studio en el modo de lanzamiento.
Pop Catalin
1
/d:RELEASETambién funcionaría. También puede agregar esto a los símbolos de compilación condicional en Configuración de lanzamiento (pestaña de compilación de propiedades del proyecto).
SliverNinja - MSFT