// preprocessor_if.cs#define DEBUG
#define VC_V7
using System;publicclassMyClass{staticvoidMain(){#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");#elseConsole.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 Это действительно хорошо, но имеет ограничения, например, когда вы пытаетесь вернуть значение из условного метода (насколько я понимаю). Думаю, поможет встроенный пример.
Hamish Grubijan,
1
Это также не препятствует компиляции кода, это просто не позволяет этот код. Это различие важно, когда вы хотите удалить зависимости и тому подобное.
Ли Лувьер,
1
В C # есть препроцессор. Он работает немного иначе, чем C ++ и C.
Это второстепенный вопрос, но в C # нет препроцессора. # директивы обрабатываются основным компилятором, как если бы существовал препроцессор. См. Здесь: msdn.microsoft.com/en-us/library/ed8yd1ha.aspx Главный результат этого различия заключается в том, что макросы стиля c / c ++ не работают.
Ответы:
Убедитесь, что в свойствах сборки установлен флажок для определения DEBUG.
источник
Я бы порекомендовал вам использовать условный атрибут !
Обновление: 3,5 года спустя
Вы можете использовать
#if
это так ( пример скопирован из MSDN ):Полезно только для исключения частей методов.
Если вы используете,
#if
чтобы исключить какой-либо метод из компиляции, вам придется исключить из компиляции все части кода, которые также вызывают этот метод (иногда вы можете загрузить некоторые классы во время выполнения, и вы не можете найти вызывающего с помощью «Найти все ссылки»). Иначе будут ошибки.С другой стороны, если вы используете условную компиляцию, вы все равно можете оставить все фрагменты кода, которые вызывают метод. Все параметры будут проверяться компилятором. Метод просто не будет вызываться во время выполнения . Я думаю, что лучше всего один раз скрыть метод и не удалять весь код, который его вызывает. Вам не разрешается использовать условный атрибут в методах, которые возвращают значение - только в методах void. Но я не думаю, что это большое ограничение, потому что, если вы используете
#if
метод, который возвращает значение, вам также нужно скрыть все фрагменты кода, которые его вызывают.Вот пример:
Резюме:
Я бы использовал
#ifdef
C ++, но с C # / VB я бы использовал атрибут Conditional. Таким образом вы скрываете определение метода, не скрывая фрагменты кода, которые его вызывают. Вызывающий код по-прежнему компилируется и проверяется компилятором, однако метод не вызывается во время выполнения. Вы можете использовать,#if
чтобы избежать зависимостей, потому что с атрибутом Conditional ваш код все еще компилируется.источник
В C # есть препроцессор. Он работает немного иначе, чем C ++ и C.
Вот ссылки MSDN - раздел обо всех директивах препроцессора .
источник