Подтвердить что ты не робот

#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
4b9b3361

Ответ 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