#ifdef в C # - PullRequest
       63

#ifdef в C #

113 голосов
/ 10 июня 2009

Я хотел бы сделать ниже, но в C # вместо 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

Ответы [ 4 ]

159 голосов
/ 10 июня 2009
#if DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif

Убедитесь, что у вас установлен флажок для определения DEBUG в свойствах вашей сборки.

46 голосов
/ 10 июня 2009

Я бы порекомендовал вам использовать Условный атрибут !

Обновление: через 3,5 года

Вы можете использовать #if следующим образом ( пример, скопированный с 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
    }
}

Полезно только для исключения частей методов.

Если вы используете #if для исключения какого-либо метода из компиляции, вам придется исключить из компиляции все фрагменты кода, которые также вызывают этот метод (иногда вы можете загрузить некоторые классы во время выполнения и вы не можете найти вызывающего с Найти все ссылки "). В противном случае будут ошибки.

Если вы используете условную компиляцию с другой стороны, вы все равно можете оставить все фрагменты кода, которые вызывают метод. Все параметры будут по-прежнему проверяться компилятором. Метод просто не будет вызываться во время выполнения . Я думаю, что лучше спрятать метод только один раз и не удалять весь код, который его вызывает. Вы не можете использовать условный атрибут в методах, которые возвращают значение - только в методах void. Но я не думаю, что это большое ограничение, потому что если вы используете #if с методом, который возвращает значение, вы должны скрыть все фрагменты кода, которые его тоже вызывают.

Вот пример:


    // calling Class1.ConditionalMethod() will be ignored at runtime 
    // unless the DEBUG constant is defined


    using System.Diagnostics;
    class Class1 
    {
       [Conditional("DEBUG")]
       public static void ConditionalMethod() {
          Console.WriteLine("Executed Class1.ConditionalMethod");
       }
    }

Резюме:

Я бы использовал #ifdef в C ++, но с C # / VB я бы использовал атрибут Conditional. Таким образом, вы скрываете определение метода без необходимости скрывать фрагменты кода, которые его вызывают. Вызывающий код все еще компилируется и проверяется компилятором, хотя метод не вызывается во время выполнения. Возможно, вы захотите использовать #if, чтобы избежать зависимостей, потому что с условным атрибутом ваш код все еще компилируется.

43 голосов
/ 10 июня 2009

#if будет твоим новым другом, я думаю.

Если вы хотите определить свои собственные символы компиляции, вы можете сделать это в свойствах проекта (на вкладке «Сборка»; «Условные символы компиляции»).

1 голос
/ 10 июня 2009

C # имеет препроцессор. Это работает только немного по-другому, чем это C ++ и C.

Вот ссылки MSDN - раздел на все директивы препроцессора .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...