#ifdef em C #

116

Eu gostaria de fazer o seguinte, mas em C # em vez de C ++

#ifdef _DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif

fonte
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 DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif

Certifique-se de ter a caixa de seleção para definir DEBUG marcada nas propriedades de construção.

pesado
fonte
51

Eu recomendo que você use o Atributo Condicional !

Atualização: 3,5 anos depois

Você pode usar #ifassim ( exemplo copiado do MSDN ):

// preprocessor_if.cs
#define DEBUG
#define VC_V7
using System;
public class MyClass 
{
    static void Main() 
    {
#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");
#else
        Console.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.

Pavel Nikolov
fonte
1
+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.

Aqui estão os links do MSDN - a seção sobre todas as diretivas de pré-processador .

Karl T.
fonte
11
É 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.
Simon P Stevens