Есть ли способ установить значение #define во время выполнения?

StackOverflow https://stackoverflow.com/questions/272459

  •  07-07-2019
  •  | 
  •  

Вопрос

Интересно, есть ли способ установить значение #define во время выполнения.

Я предполагаю, что в приведенном ниже коде есть запрос для Oracle specific и Sql Server specific.

#define oracle

// ...    

#if oracle
// some code
#else
// some different code.
#endif
Это было полезно?

Решение

Абсолютно нет, #defines компилируется препроцессором еще до того, как компилятор его видит, поэтому токен «oracle» даже не находится в вашем коде, просто «1» или «0». Измените #define на глобальную переменную или (лучше) функцию, которая возвращает правильное значение.

Другие советы

#if это время компиляции.Вы могли бы указать это в процессе сборки (через переключение на msbuild / csc), но не во время выполнения.Исключенный код не существует.Возможно, вам было бы лучше посоветовать (1 из):

  • Имейте отдельные стеки DAL для каждого серверного модуля, используя внедрение зависимостей / IoC
  • Используйте инструмент ORM, который поддерживает либо
  • Ветвление кода на основе провайдера (в одном DAL)

Нет, препроцессор запускается перед компиляцией и может изменять код в это время, в этом его цель, если вы хотите переключать поведение на основе чего-либо во время выполнения, используйте переменную и обычную условную логику.

Ваш дизайн неправильный. Абсолютно неправильно. Это может быть приемлемо 20 лет назад, но есть гораздо более совершенные методы для того, чтобы делать то, что вам нужно здесь.

Вам необходимо разбить всю логику доступа к данным на интерфейсы, которые не зависят от фактической реализации (на основе sql или oracle), а затем использовать DI / IoC для внедрения требуемой реализации во время выполнения. Это намного проще, чем кажется, работает очень хорошо, облегчает тестирование вашего кода и позволяет настраивать и обновлять ваше приложение без необходимости полной переустановки.

Похожие вопросы:
https://stackoverflow.com/questions/45191/ioc- объяснить-и-более-важным, когда в использовании-он
Инверсия управления с помощью .net
https://stackoverflow.com/questions/71041/ какой-единственный-iocdi-контейнер-вы-рекомендовать-использовать-и-почему

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top