C # если директива - PullRequest
       24

C # если директива

0 голосов
/ 12 апреля 2011

Могу ли я написать в коде значение переменной true или false в зависимости от нажатой кнопки?Смотрите пример ниже.

Если нет, то какие еще способы существуют для достижения подобных эффектов?Я уже пометил коды для различных режимов с помощью директив и хочу, чтобы разработчики имели возможность переключения режимов, но теперь я хочу дать пользователю возможность переключения между режимами.Выбор режима будет предоставлен только при запуске программы, и пользователю не разрешено переключать режим.Чтобы переключить режим, он может только перезапустить программу снова.

Если не можете использовать директивы, какой самый быстрый способ я могу использовать?(примечание: все заявления основаны на решении)

В псевдокоде того, чего я хочу достичь:

void button_click(...){
    if(!CONDITION)
        CONDITION = true;
    else
        CONDITION = false;
}


...
#if CONDITION
   //mode X with addtional steps
#endif

Ответы [ 7 ]

5 голосов
/ 12 апреля 2011

Вы используете директиву препроцессора и пытаетесь установить ее из кода, который побеждает цель, даже если бы это было возможно (я почти уверен, что вы не можете). Почему бы не использовать обычное логическое поле в качестве флага?

private bool Condition {get; set;}
2 голосов
/ 12 апреля 2011

Это невозможно.Оператор if выполняется во время выполнения, но директивы препроцессора, такие как #IF, выполняются во время компиляции.Вам нужно решить во время компиляции, как создать код, и где-нибудь в вашем проекте (скажем, в свойствах проекта) или в верхней части исходного файла установите CONDITION на то, что вам нужно для данной сборки.

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

0 голосов
/ 11 декабря 2018

#IF определяется во время компиляции, и вы хотите изменить его во время выполнения. Это невозможно.

0 голосов
/ 12 апреля 2011

Директива #IF является опцией препроцессора и не будет иметь смысла после компиляции кода, поэтому ее нельзя использовать для управления потоком программы после компиляции.

Что касается других ваших опций, вам следуетбыть в состоянии преобразовать их в переменные уровня класса довольно легко, но, с другой стороны, ваш код будет изобиловать if CONDITION ... else ... утверждениями, которые могут в конечном итоге доставить боль в задницу.

Еще один более удобный для ООП вариант заключается в реализации шаблона State .Вы можете инкапсулировать поведение каждого «Условия» в его собственное состояние и переключаться между ними в шаблоне.Это может быть излишним для двух государств (скорее всего, так).

Другая ссылка: http://www.dofactory.com/Patterns/PatternState.aspx

0 голосов
/ 12 апреля 2011

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

0 голосов
/ 12 апреля 2011

Директива #IF используется для условной компиляции, что означает, что она ищет токены, определенные во время компиляции и буквально компилирует или не компилирует определенный код. Это означает, что не скомпилированный код не является частью вашей программы и не может использоваться во время выполнения. Вам нужно будет изменить свой код, чтобы использовать обычные флаги, а не условную компиляцию, если вы хотите изменить поведение во время выполнения. Тем не менее, вы можете рассмотреть более глубокий анализ проекта, поскольку добавление новых функций ветвления на основе флагов конфигурации может очень быстро привести к грязному коду.

0 голосов
/ 12 апреля 2011

Если вы спрашиваете, можете ли вы скомпилировать что-то по условию, основываясь на условии в вашем коде, ответ - нет.Компилятор должен знать во время компиляции, что включать в вашу сборку.Вы почти наверняка можете добиться того, что вы пытаетесь, без условной компиляции, однако, что вы пытаетесь сделать?

...