Nas propriedades da solução, tenho a configuração definida como "release" para meu primeiro e único projeto.
No início da rotina principal, eu tenho esse código e está mostrando "Mode = Debug". Eu também tenho essas duas linhas no topo:
#define DEBUG
#define RELEASE
Estou testando a variável correta?
#if (DEBUG)
Console.WriteLine("Mode=Debug");
#elif (RELEASE)
Console.WriteLine("Mode=Release");
#endif
Meu objetivo é definir padrões diferentes para variáveis com base no modo de depuração vs versão.
c#
debugging
release
compiler-directives
NealWalters
fonte
fonte
Respostas:
DEBUG
/ já_DEBUG
deve estar definido no VS.Remova o
#define DEBUG
código. Defina pré-processadores na configuração da construção para essa construção específica.A razão pela qual ele imprime "Mode = Debug" é por causa do seu
#define
e então ignora oelif
.A maneira correta de verificar é:
Não verifique
RELEASE
.fonte
#if
e não#ifdef
?#ifdef
é específico para o pré-processador de C / C ++, o C # exige o uso de#if
.Por padrão, o Visual Studio define DEBUG se o projeto é compilado no modo Debug e não o define se estiver no modo Release. RELEASE não está definido no modo Release por padrão. Use algo como isto:
Se você quiser fazer algo apenas no modo de lançamento:
Além disso, vale ressaltar que você pode usar o
[Conditional("DEBUG")]
atributo em métodos que retornamvoid
para executá-los apenas se um determinado símbolo estiver definido. O compilador removeria todas as chamadas para esses métodos se o símbolo não estiver definido:fonte
Eu prefiro verificá-lo assim do que procurar
#define
diretivas:Com a ressalva de que, é claro, você pode compilar e implantar algo no modo de depuração, mas ainda não tem o depurador conectado.
fonte
#IF DEBUG
em situação de código de depuração que não deve durar. Para o código de produção, concordo com o uso acima.#DEBUG
é que esta instrução if está no seu código e sempre é verificada onde, como a#DEBUG
resposta remove o código que não é aplicável no tempo de compilação, para que você não tenha uma verificação em tempo de execução e sua. exe (ou o que você compilar) é menor.Eu não sou um grande fã do material #if, especialmente se você o espalhar por toda a sua base de código, pois isso causará problemas nos quais as construções de depuração passam, mas as versões de liberação falham se você não tomar cuidado.
Então, aqui está o que eu criei (inspirado em #ifdef em C # ):
fonte
DebuggingService
não é uma classe estática e por que você precisa de uma interface? Isso tem algo a ver com usar isso com um contêiner de IoC?O método
Debug.Assert
tem atributo condicionalDEBUG
. Se não estiver definido, a chamada e a atribuiçãoisDebug = true
são eliminadas :Se
DEBUG
for definido,isDebug
é definido comotrue
(e passado paraDebug.Assert
, o que não faz nada nesse caso).fonte
var iterations = 10; Debug.Assert((iterations = Int32.MaxValue) > 0);
Se você estiver tentando usar a variável definida para o tipo de construção, remova as duas linhas ...
... isso fará com que o #if (DEBUG) seja sempre verdadeiro.
Também não há um símbolo de compilação condicional padrão para RELEASE . Se você deseja definir uma, vá para as propriedades do projeto, clique no botão Build guia e adicione RELEASE à caixa de texto Símbolos de compilação condicional, sob o cabeçalho Geral .
A outra opção seria fazer isso ...
fonte
Remova suas definições na parte superior
fonte
Versão ligeiramente modificada (bastardizada?) Da resposta de Tod Thomson como uma função estática, em vez de uma classe separada (eu queria poder chamá-la em uma vinculação de exibição do WebForm de uma classe de viewutils que eu já havia incluído).
fonte
Certifique-se de definir a constante DEBUG nas propriedades de criação do projeto. Isso ativará o
#if DEBUG
. Não vejo uma constante RELEASE predefinida, o que poderia implicar que qualquer coisa que não esteja em um bloco DEBUG seja o modo RELEASE.fonte
NameSpace
Método
fonte
Uma dica que pode economizar muito tempo - não esqueça que, mesmo se você escolher
debug
na configuração de compilação (no menu vs2012 / 13, está em BUILD => CONFIGURATION MANAGER) - isso não é suficiente.Você precisa prestar atenção ao PUBLISH
Configuration
, como tal:fonte
Como o objetivo dessas diretrizes do COMPILER é instruir o compilador a NÃO incluir código, código de depuração, código beta ou talvez o código necessário para todos os seus usuários finais, exceto os do departamento de publicidade, por exemplo, #Define AdDept que você deseja poderá incluí-los ou removê-los com base nas suas necessidades. Sem ter que alterar seu código-fonte se, por exemplo, um AdDept não for mesclado ao AdDept. Então, tudo o que precisa ser feito é incluir a diretiva #AdDept na página de propriedades das opções do compilador de uma versão existente do programa e fazer uma compilação e pronto! o código do programa mesclado ganha vida !.
Você também pode usar um declarativo para um novo processo que não está pronto para o horário nobre ou que não pode estar ativo no código até a hora de liberá-lo.
De qualquer forma, é assim que eu faço.
fonte
Eu comecei a pensar em uma maneira melhor. Percebi que os blocos #if são efetivamente comentários em outras configurações (assumindo
DEBUG
ouRELEASE
; mas verdadeiro com qualquer símbolo)fonte
Remova as definições e verifique se o condicional está no modo de depuração. Você não precisa verificar se a diretiva está no modo de liberação.
Algo assim:
fonte