#ifdef в С#

Я хотел бы сделать ниже, но в С# вместо С++

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

Ответ 1

#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 в ваших свойствах сборки.

Ответ 2

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

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

Ответ 3

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

Обновление: через 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, чтобы исключить какой-либо метод из компиляции, вам придется исключить из компиляции все фрагменты кода, которые также вызывают этот метод (иногда вы можете загружать некоторые классы во время выполнения, и вы не можете найти вызывающего абонента с "Найти все ссылки" ). В противном случае будут ошибки.

Если вы используете условную компиляцию, с другой стороны, вы все равно можете оставить все фрагменты кода, которые вызывают метод. Все параметры будут все еще проверены компилятором. Метод просто не будет вызываться во время выполнения. Я думаю, что лучше всего скрыть метод только один раз и не удалять весь код, который его вызывает. Вы не можете использовать условный атрибут для методов, возвращающих значение - только по недействительным методам. Но я не думаю, что это большое ограничение, потому что, если вы используете #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 в С++, но с С#/VB я использовал бы условный атрибут. Таким образом, вы скрываете определение метода без необходимости скрывать фрагменты кода, которые его называют. Вызывающий код все еще компилируется и проверяется компилятором, однако метод не вызывается во время выполнения. Вы можете использовать #if, чтобы избежать зависимостей, потому что с атрибутом Conditional ваш код все еще компилируется.