2013-04-07 2 views
0

У меня есть приложение, в котором я использовал ключи компилятора для управления включением больших блоков кода или нет. Думайте автомобиль с автоматической коробкой передач или механической коробкой передач. Прекрасно работает в режиме отладки, но в режиме деблокирования похоже, что и автоматическая трансмиссия, и ручная трансляция скомпилированы, поэтому автомобиль не слишком хорошо управляется ...Переключатели компилятора C# в режиме деблокирования

Так я ошибаюсь, пытаясь получить функциональность управления опцией из компиляторы?

Подробнее: Мое понимание переключателей компилятора было ошибочным.

Простой проект в комментариях ниже. (Не слишком хорошо, при езде StackOverflow)

Чтобы продолжить аналогию, проект (Winform) был построен с механической коробкой передач. Он был развернут в режиме отладки с использованием проекта установки. (Ошибка).

Через несколько лет потребовалась автоматическая коробка передач. (Нет общности, чтобы привести к базовому классу). Мысль о том, что в один прекрасный день может потребоваться дополнительная коробка передач вручную)

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

После нескольких лет работы я решил, что его следует отпустить. Именно тогда я заметил проблему.

Простой пример (спасибо) показал мне, что это не оба блока, которые были скомпилированы, а только блок в #else. то есть, релиз сборки рассматривает выключатель как выключенный.

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

+1

Очень сложно понять, о чем вы говорите, можете ли вы опубликовать несколько коротких примеров кода, иллюстрирующих это? – Oded

+0

Erm, так что вы в основном потеряли трек #ifdefs? Тогда вы используете слишком много. –

+0

Простой пример показывает, что в версии сборки игнорируется компилятор. В моем оригинальном посте я ошибался. поэтому, если я не пойму. не используйте переключатели компилятора для параметров проекта. открытый частичный класс Form1: Форма { public Form1() { InitializeComponent(); Дисплей(); } частная пустота Display() { #if (MySwitch) MessageBox.Показать («MySwitch on»); #else MessageBox.Show («MySwitch off»); #endif } –

ответ

0

Предлагаю вам использовать композицию вместо этого и использовать объектную ориентацию. Есть два класса, один для AutoTransmission, а другой для ManualTransmission. Каждый из них будет основываться на базовом классе Transmission. Затем вы можете использовать любой из них, как вы сочтете нужным, при создании объекта, который использует одну из этих передач.

Затем, когда вы создаете объект, который использует Transmission, просто создайте экземпляр любой необходимой вам передачи. Это можно определить в config, или это могут быть константы компилятора. Но я бы рекомендовал против констант компилятора, потому что когда вы выполняете автоматические блоки рефакторинга, которые могут быть отключены #ifdef, это не будет обработано и может не создаваться при изменении параметров вашего компилятора.