O #if RELEASE funcionará como o #if DEBUG em C #?

277

Em todos os exemplos que eu vi da diretiva de compilador #if, eles usam "DEBUG". Posso usar "RELEASE" da mesma maneira para excluir código que não quero executar quando compilado no modo de depuração? O código que eu quero cercar com esse bloco envia muitos e-mails e não quero enviá-los acidentalmente durante o teste.

Brian Sullivan
fonte
3
#if !DEBUGserve a mesma função que #if RELEASEteria. Como alternativa, #if DEBUGentão #else, #endifse houver um código diferente para executar nos modos.
Nat

Respostas:

275

Não, não vai, a menos que você faça algum trabalho.

A parte importante aqui é o que realmente é DEBUG, e é um tipo de constante definida que o compilador pode verificar.

Se você verificar as propriedades do projeto, na guia Compilar, encontrará três coisas:

  • Uma caixa de texto chamada "Símbolos de compilação condicional"
  • Uma caixa de seleção rotulada "Definir constante DEBUG"
  • Uma caixa de seleção rotulada "Definir constante TRACE"

Não existe essa caixa de seleção, nem constante / símbolo predefinido com o nome RELEASE.

No entanto, você pode facilmente adicionar esse nome à caixa de texto denominada Símbolos de compilação condicional, mas certifique-se de definir a configuração do projeto para o modo Release antes de fazer isso, pois essas configurações são por configuração.

Então, basicamente, a menos que você adicione isso à caixa de texto, #if RELEASEnão produzirá nenhum código em nenhuma configuração.

Lasse V. Karlsen
fonte
393

RELEASE não está definido, mas você pode usar

#if (!DEBUG)
  ...
#endif
M4N
fonte
2
Não é, mas é claro que você pode usar o operador NOT assim. Não pensei nisso quando escrevi minha resposta.
Lasse V. Karlsen
4
Sim, mas usar sua solução é mais clara e "mais correta", IMHO.
217 Daniel Schaffer
1
Especialmente desde que você pode ter mais configurações do que apenas RELEASE e DEBUG - para alguns dos meus projetos há debug, release e implantar ou DEV (depuração), teste e PROD (RELEASE)
Adam Nofsinger
Para qualquer outra pessoa confusa com os comentários acima, a resposta não editada se perguntou se RELEASEfoi definido.
Dan
41

Não.

Enquanto na configuração de depuração, há um DEBUG constante definida (definida automaticamente pelo Visual Studio), enquanto não existe essa constante definida para o modo de liberação. Verifique as configurações do seu projeto em build.

Selecionando [Definir constante DEBUG] em Projeto -> Compilar é como incluir #define DEBUG no início de cada arquivo.

Se você deseja definir uma constante RELEASE para a configuração do release, acesse:

  • Propriedades do projeto -> Compilar
  • Selecione o modo de liberação
  • na caixa de texto Símbolos de compilação condicional, digite: RELEASE
Pop Catalin
fonte
1
Achei isso muito útil, pois agora eu defini uma constante RELEASE para minha configuração de versão e uma constante TESTING para minha configuração de teste. Muito útil para a definição exigem https apenas para liberação#if (RELEASE) [RequireHttps] #endif
tekiegirl
27

Na minha instalação do VS (VS 2008) #if RELEASEnão funciona. No entanto, você poderia apenas usar#if !DEBUG

Exemplo:

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

Nunca vi isso antes ... mas já vi:

#if (DEBUG == FALSE)

e

#if (!DEBUG)

Esse trabalho para você?

Pete H.
fonte
Os símbolos do pré-processador não têm valores em C #; eles são apenas "definidos" ou "não definidos". Portanto, apenas o !operador funcionará, como no seu segundo exemplo.
Jonathon Reinhart
1
De acordo com o MSDN, você pode usar operadores como == para testar se é verdadeiro ou falso. msdn.microsoft.com/en-us/library/4y6tbswk.aspx
jason_ruz
8

Você pode usar #if(!DEBUG)para esse fim.

Abdus Salam Azad
fonte
Boa economia para mim estava querendo usar isso em xamrian obrigado por postar.
Rogue39nin 6/07/19
4

"Pop Catalin" acertou. O controle da definição com base no tipo de construção fornece uma grande flexibilidade. Por exemplo, você pode ter uma configuração "DEBUG", "DEMO" e "RELEASE" na mesma solução. Isso evita a necessidade de programação duplicada com duas soluções diferentes.

Então sim #if RELEASEou #if (RELEASE)funciona da mesma maneira que #if DEBUGquando o símbolo de compilação RELEASE Condicional é definido.

O seguinte é retirado da publicação "Pop Catalin": Se você deseja definir uma constante RELEASE para a configuração da versão, vá para: * Propriedades do projeto -> Construção * Selecione o modo de liberação * na caixa de texto Símbolos de compilação condicional, digite: RELEASE


fonte
2

Sei que essa é uma pergunta antiga, mas vale a pena mencionar que você pode criar suas próprias configurações fora do DEBUG e RELEASE, como TEST ou UAT.

Se, na guia Compilar da página de propriedades do projeto, você definir os "Símbolos de compilação condicional" como TEST (por exemplo), poderá usar uma construção como

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

Você pode usar essa construção por motivos específicos, como clientes diferentes, se necessário, ou mesmo Métodos da Web inteiros, por exemplo. Também usamos isso no passado, onde alguns comandos causaram problemas em hardware específico, portanto, temos uma configuração para um aplicativo quando implantado no hardware X.

Fetchez la vache
fonte
0

Você pode criar seus próprios símbolos condicionais em tempo de compilação (qualquer nome que desejar). Vá para a "caixa de diálogo Build do projeto", localizada na caixa de propriedades do projeto, opção de menu: Projeto -> [nome do projeto] Propriedades ...

Você também pode defini-los "na parte superior do arquivo de código C #". Gostar:

#define RELEASE
// or
#undef RELEASE

você pode usar o símbolo em uma instrução #if:

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

// or

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

por que não apenas

#if RELEASE
#undef DEBUG
#endif
Matt Davison
fonte
3
Não há constante denominada RELEASE definida pelo Visual Studio no modo de lançamento.
Pop Catalin
1
/d:RELEASEtambém funcionaria. Você também pode adicionar isso aos símbolos de compilação condicional em Configuração da versão (guia de criação de propriedades do projeto).
SliverNinja - MSFT