Verifique esta excelente resposta também, ela mostra como você pode adicionar símbolos de depuração com base nas condições por meio do arquivo de projeto (.csproj).
Matt
Respostas:
162
#if DEBUGbool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging#elsebool bypassCheck =false;//NEVER bypass it#endif
Certifique-se de ter a caixa de seleção para definir DEBUG marcada nas propriedades de construção.
// preprocessor_if.cs#define DEBUG#define VC_V7
using System;publicclassMyClass{staticvoidMain(){#if (DEBUG && !VC_V7)Console.WriteLine("DEBUG is defined");#elif(!DEBUG && VC_V7)Console.WriteLine("VC_V7 is defined");#elif(DEBUG && VC_V7)Console.WriteLine("DEBUG and VC_V7 are defined");#elseConsole.WriteLine("DEBUG and VC_V7 are not defined");#endif}}
Útil apenas para excluir partes de métodos.
Se você usar #ifpara excluir algum método da compilação, terá que excluir da compilação todas as partes do código que chamam esse método também (às vezes você pode carregar algumas classes em tempo de execução e não pode encontrar o chamador com "Encontrar todas as referências"). Caso contrário, haverá erros.
Por outro lado, se você usar a compilação condicional, ainda poderá deixar todas as partes do código que chamam o método. Todos os parâmetros ainda serão validados pelo compilador. O método simplesmente não será chamado em tempo de execução . Acho que é muito melhor ocultar o método apenas uma vez e não ter que remover todo o código que o chama também. Você não tem permissão para usar o atributo condicional em métodos que retornam valor - somente em métodos void. Mas não acho que seja uma grande limitação porque se você usar #ifcom um método que retorna um valor, você terá que ocultar todas as partes do código que o chamam também.
Aqui está um exemplo:
// chamar Class1.ConditionalMethod () será ignorado no tempo de execução
// a menos que a constante DEBUG seja definida
using System.Diagnostics;
classe Class1
{
[Condicional ("DEBUG")]
public static void ConditionalMethod () {
Console.WriteLine ("Class1.ConditionalMethod executado");
}
}
Resumo:
Eu usaria #ifdefem C ++, mas com C # / VB eu usaria o atributo condicional. Dessa forma, você oculta a definição do método sem ter que ocultar as partes do código que o chamam. O código de chamada ainda é compilado e validado pelo compilador, embora o método não seja chamado em tempo de execução. Você pode querer usar #ifpara evitar dependências porque com o atributo Condicional seu código ainda está compilado.
+1 Isso é bom de fato, mas tem limitações, como quando você tenta retornar um valor de um método condicional (pelo que entendi). Um exemplo inline ajudaria, eu acho.
Hamish Grubijan
1
Também não impede que o código seja compilado, simplesmente não permite esse código. A distinção é importante quando você deseja remover dependências e tal.
Lee Louviere
1
C # tem um pré-processador. Funciona de maneira um pouco diferente do C ++ e C.
É um ponto menor, mas C # NÃO tem um pré-processador. # diretivas são processadas pelo compilador principal como se houvesse um pré-processador. Veja aqui: msdn.microsoft.com/en-us/library/ed8yd1ha.aspx O principal resultado dessa distinção é que as macros de estilo c / c ++ não funcionam.
Respostas:
Certifique-se de ter a caixa de seleção para definir DEBUG marcada nas propriedades de construção.
fonte
Eu recomendo que você use o Atributo Condicional !
Atualização: 3,5 anos depois
Você pode usar
#if
assim ( exemplo copiado do MSDN ):Útil apenas para excluir partes de métodos.
Se você usar
#if
para excluir algum método da compilação, terá que excluir da compilação todas as partes do código que chamam esse método também (às vezes você pode carregar algumas classes em tempo de execução e não pode encontrar o chamador com "Encontrar todas as referências"). Caso contrário, haverá erros.Por outro lado, se você usar a compilação condicional, ainda poderá deixar todas as partes do código que chamam o método. Todos os parâmetros ainda serão validados pelo compilador. O método simplesmente não será chamado em tempo de execução . Acho que é muito melhor ocultar o método apenas uma vez e não ter que remover todo o código que o chama também. Você não tem permissão para usar o atributo condicional em métodos que retornam valor - somente em métodos void. Mas não acho que seja uma grande limitação porque se você usar
#if
com um método que retorna um valor, você terá que ocultar todas as partes do código que o chamam também.Aqui está um exemplo:
Resumo:
Eu usaria
#ifdef
em C ++, mas com C # / VB eu usaria o atributo condicional. Dessa forma, você oculta a definição do método sem ter que ocultar as partes do código que o chamam. O código de chamada ainda é compilado e validado pelo compilador, embora o método não seja chamado em tempo de execução. Você pode querer usar#if
para evitar dependências porque com o atributo Condicional seu código ainda está compilado.fonte
C # tem um pré-processador. Funciona de maneira um pouco diferente do C ++ e C.
Aqui estão os links do MSDN - a seção sobre todas as diretivas de pré-processador .
fonte