#ifdef в C #

117

Я хотел бы сделать следующее, но на 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

источник
Проверьте также этот отличный ответ , он показывает, как можно добавлять символы отладки в зависимости от условий через файл проекта (.csproj).
Мэтт

Ответы:

163
#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.

heavyd
источник
52

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

Обновление: 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метод, который возвращает значение, вам также нужно скрыть все фрагменты кода, которые его вызывают.

Вот пример:

    // вызов Class1.ConditionalMethod () будет проигнорирован во время выполнения 
    // если не определена константа DEBUG


    с помощью System.Diagnostics;
    класс Class1 
    {
       [Условное ( "DEBUG")]
       public static void ConditionalMethod () {
          Console.WriteLine («Выполненный класс1.ConditionalMethod»);
       }
    }

Резюме:

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

Павел Николов
источник
1
+1 Это действительно хорошо, но имеет ограничения, например, когда вы пытаетесь вернуть значение из условного метода (насколько я понимаю). Думаю, поможет встроенный пример.
Hamish Grubijan,
1
Это также не препятствует компиляции кода, это просто не позволяет этот код. Это различие важно, когда вы хотите удалить зависимости и тому подобное.
Ли Лувьер,
1

В C # есть препроцессор. Он работает немного иначе, чем C ++ и C.

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

Карл Т.
источник
11
Это второстепенный вопрос, но в C # нет препроцессора. # директивы обрабатываются основным компилятором, как если бы существовал препроцессор. См. Здесь: msdn.microsoft.com/en-us/library/ed8yd1ha.aspx Главный результат этого различия заключается в том, что макросы стиля c / c ++ не работают.
Саймон П. Стивенс