Я хотел бы сделать ниже, но в С# вместо С++
#ifdef _DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif
Я хотел бы сделать ниже, но в С# вместо С++
#ifdef _DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif
#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 в ваших свойствах сборки.
#if
будет вашим новым другом, я думаю.
Если вы хотите определить свои собственные символы компиляции, вы можете сделать это в свойствах проекта (на вкладке "Сборка", "Условные символы компиляции" ).
Я бы рекомендовал вам использовать Условный атрибут!
Обновление: через 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 ваш код все еще компилируется.
С# имеет препроцессор. Он работает несколько иначе, чем С++ и C.
Вот ссылки MSDN - раздел все директивы препроцессора.