#if директива препроцессора для директив, отличных от DEBUG
Я знаю, что я могу использовать директивы препроцессора для проверки Debug/Release, выполнив следующие действия:
#if DEBUG
//debug mode
#elif
//release mode
#endif
но как насчет проверки других конфигураций, например Test. В VB вы можете сделать это:
#If CONFIG = "Release" Then
'Release mode
#ElseIf CONFIG = "Test" Then
'Test mode
#ElseIf CONFIG = "Debug" Then
'Debug mode
#End If
Итак, мой вопрос в С#, как я могу проверить тестовый режим? У меня есть код, который я хочу выполнить, если я нахожусь в режиме отладки и тестирования, но не в режиме Release, поэтому, в частности, мне нужен способ проверить, не находится ли в режиме Release. В VB я бы сделал следующее:
#If Not CONFIG = "Release" Then
'Do something here for every configuration that is not Release
#End If
Ответы
Ответ 1
То же, что и для DEBUG, , предполагая, что вы определили конфигурацию сборки, которая отображает TEST
в текстовом поле "Условные символы компиляции" (в разделе "Свойства проекта" > вкладка "Создание"; список, разделенный пробелами).
Для кода, который вы хотите использовать только в конфигурации сборки TEST:
#if TEST
// ...
#endif
И для кода, который вы не хотите запускать в конфигурации сборки TEST, вы можете либо #else
выше, либо сделать это:
#if !TEST
// ...
#endif
Ответ 2
Существует несколько способов обработки ваших факторингов. В моем мире мы использовали четыре основных метода:
- флаги компилятора (
#if
)
- частичные классы
- отдельные реализации
- Решения времени выполнения
Так, например, у нас есть конфигурации сборки для С# с неуправляемым кодом, С# со всем управляемым кодом, С# для silverlight. В неуправляемом проекте С# мы имеем символ времени компиляции UNMANAGED
, для С# имеем MANAGED
, а для silverlight мы имеем SILVERLIGHT
. Это позволяет мне вводить небольшие задачи в код и обмениваться одними и теми же файлами во всех проектах. Ничего страшного.
Для частичных классов у нас есть отдельные файлы .cs для каждого проекта, которые имеют реализации кода бахромы. Это используется в тех случаях, когда мы не могли бы выполнить эту работу, имея абстрактный класс как родительский класс с большей частью реализации, а затем код бахромы в конкретных классах для каждой цели. Это работает достаточно хорошо.
Для отдельных реализаций мы признаем, что между базами кода мало, и нам лучше с отдельным кодом. Это не идеально, но так оно и есть.
Для проверок времени выполнения это именно так. Вместо проверки DEBUG
в #if
, вы используете проверку времени выполнения для настройки, чтобы сделать этот выбор. Если у вас нет огромных отладочных лесов, это не плохой выбор, так как он также позволяет выполнять отладочную работу (но у вас могут быть ограничения доставки, которые его предотвращают).
Лично я стараюсь избегать флагов компилятора. Они делают код более трудным для чтения. Честно говоря, есть моменты, когда они имеют смысл. У нас были классы, которые не будут компилироваться в silverlight только из-за объявления класса (я думаю, что ObservableCollection был недоступен), и нам пришлось наследовать что-то еще. Все остальное отлично работало.
Ответ 3
Щелкните правой кнопкой мыши имя имени проекта [Имя проекта], которое вы хотите использовать в пользовательской директиве прекомпилятора.
Перейдите в элемент свойств, а затем на вкладку сборки.
тогда вам нужно добавить свою настраиваемую директиву в текстовое поле. Например, я добавил "Local", так как моя пользовательская директива см. Ниже.
![enter image description here]()
Теперь вы можете использовать новую директиву компилятора, как показано ниже в вашем (на С#)
#if **Local**
//TODO:Add your c# code here
#endif
Ответ 4
Простой ответ
- Перейдите в Project → [Project name] Properties- > Build
- Установлен флажок [] Определить DEBUG
Теперь вы можете играть с директивой предшественника DEBUG, например
#if DEBUG
...
#else
...
#endif