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.


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.


393

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

#if (!DEBUG)
  ...
#endif

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

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

10

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

#if (DEBUG == FALSE)

e

#if (!DEBUG)

Esse trabalho para você?


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


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


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.


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

-8

por que não apenas

#if RELEASE
#undef DEBUG
#endif

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.