Есть ли что-то лучше директив препроцессора (#if и т. Д.) В C #? - PullRequest
0 голосов
/ 09 июля 2019

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

У меня есть код, который зависит от периферийного устройства (например, кард-ридер). Иногда я им не пользуюсь, а это значит, что библиотеки нет. (И я хорошо себя чувствую, потому что «библиотека» означает установку пакета программ объемом 2 ГБ). Когда я удаляю библиотеку, я не могу открыть устройство. Если я не могу открыть устройство, я не могу создать участника класса, который его использует. Поскольку класс не работает, я не могу вызывать его методы из кода. Поэтому я не могу просто не выполнять его; Мне нужно, чтобы он ушел, поскольку он не будет компилироваться без библиотеки.

Директивы препроцессора, такие как #if и все, что в порядке, возможно; но эти вещи появляются в более чем одном файле, что означает независимое поддержание #define вверху каждого. Я пришел из более простого места (имеется в виду, C), где один заголовочный файл может быть использован для управления этим. Я отмечаю, что C # довольно враждебно относится к #define (либо метка существует, либо нет; константы или вычисления не допускаются), и это заставляет меня думать, что есть другой способ.

Как вы справляетесь с этим?

--- Последующие меры (s) ---

Я прочитал «дубликаты» вопросов и ответов, и у меня есть довольно хорошее представление о том, с чем я имею дело. Я не нашел эти вопросы в своем первоначальном поиске, но иногда это просто так.

@ Эми предполагает, что #define вверху означает "не так, как это делается", а скорее "поместите его в командную строку". Таким образом, (если я понимаю, что мы придерживаемся этого механизма), дискуссия может идти о том, как это сделать. Один не просто перейти к терминалу и сделать это. Это происходит как "функции IDE" или "хаки IDE".

@ Алексей Левенков спрашивает, чего я действительно хочу. Я действительно хочу (а) не получать ошибки компиляции и (б) делать это, выборочно пропуская код. И найдите C #, эквивалентный тому, что я предложил. Еще некоторые ограничения устраняются тем фактом, что я не использовал VS или C # все это время. Так что я знаю намного меньше, чем вы все. Учитывая, что я получил код от последнего человека и должен иметь дело с тем, что я вижу, я не хочу настраивать человека после меня, чтобы выяснить, какую «интересную» вещь я мог бы сделать, чтобы она работала. Таким образом, такие вещи, как ручное редактирование файла проекта, могут работать, но также могут вызывать недоумение.

@ Эрик Липперт предполагает, что «враждебный» действительно «разумный». Возможно, у меня был слишком глубокий язык в этой щеке. VS, кажется, говорит мне, что я делаю это неправильно, поэтому я почувствовал, что есть «правильный путь», о котором я просто не знаю. Что касается приложения, поддерживающего 2 ГБ, я пойду на разные компьютеры, разархивирую репозиторий и попробую кое-что, и поэтому эти «накладные расходы» хотят распространяться вместе с ним. Хуже, если я подключусь через мой телефон для загрузки. И если я создаю приложение со всем включенным, то конечный пользователь должен установить этот программный пакет до запуска программы. Теоретически, они могут быть обязаны покупать программное обеспечение. Если бы я послал вам игру в крестики-нолики и сказал, что она не запустится до тех пор, пока вы не установите Oracle, вы, вероятно, передадите все это.

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

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

1 Ответ

1 голос
/ 09 июля 2019

Как сказал @ BJ Safdie :

  • Установите их в свойствах компиляции или в параметрах сборки.
  • Вы попадаете в параметры сборки по праву.щелкнув проект и выбрав свойства из меню.

Project Build Options

...