Директива C # if

#c# #visual-studio #directive

#c# #visual-studio #директива

Вопрос:

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

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

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

В pseduocode того, чего я хочу достичь:

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


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

Комментарии:

1. Ваш вопрос мне непонятен. Вы хотите переключить логическое значение элемента с помощью кнопки?

2. Возможно, qn не был ясен … я имел в виду, потому что инструкции if directives присутствуют во всем решении, которое состоит из множества проектов. Итак, я хочу выяснить, существует ли ярлык для реализации этого в качестве функциональности для пользователя, нажав на кнопку, чтобы переключить выполнение этих инструкций (не только одной, но и многих). Раньше выбор выполнять эти инструкции или нет был только за разработчиком, теперь я хотел бы, чтобы пользователь также обладал гибкостью для этого

Ответ №1:

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

 private bool Condition {get; set;}
  

Ответ №2:

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

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

Комментарии:

1. Итак, что я могу сделать сейчас, если я не могу использовать директивы? Добавлять к каждой части кода с этими инструкциями проверку bool с использованием глобальной переменной?

Ответ №3:

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

Комментарии:

1. я сделал больше объяснений в qn

Ответ №4:

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

Ответ №5:

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

Ответ №6:

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

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

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

Еще одна ссылка: http://www.dofactory.com/Patterns/PatternState.aspx

Комментарии:

1. Я не имею в виду 2 состояния различий, скорее 2 режима различий. В одном режиме просто выполняется больше инструкций, чем в другом режиме. Я думаю, что я буду реализовывать выбор режима только в начале программы, а не во время программы, из-за инструкций инициализации… Я добавил дополнительную информацию в qn, пожалуйста, ознакомьтесь с ней.

2. @yeeen: Перечитайте ссылки о шаблоне состояния. Она по-прежнему будет охватывать то, что вы хотите, красивым и понятным способом.

Ответ №7:

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