Компилировать строки, только если в среде разработки?

Мне нужно, чтобы несколько строк кода компилировались только в среде разработки. Они помогают в разработке, а их довольно много, поэтому удалить их вручную не вариант.

Если бы вы посмотрели на Conditional Compiling и показалось, что #if было бы хорошим решением. Я новичок в этой концепции и не могу понять, как проверить текущую среду. Я знаю, как это сделать за пределами #if, но доступ внутри него сильно ограничен.

В качестве примера:

#if (Condition)
    Console.WriteLine("Hello World!")
#endif

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

Придумайте подходящее имя символа и введите его в поле «Пользовательский символ» ваших проектов. Затем проверьте с помощью #if этот символ.

Ralf 10.06.2024 10:40

Если вы хотите отличить сборку в IDE от системы сборки (помимо конфигурации отладки и выпуска), создайте также дополнительные конфигурации.

Ralf 10.06.2024 10:42

если вы хотите печатать только во время отладки, я могу порекомендовать вместо этого использовать System.Diagnostics.Debug.WriteLine. В общем, класс Debug содержит множество утилит, которые компилируются только для режимов отладки.

Raildex 10.06.2024 10:48

Это не только для печати вещей. Я просто хотел привести наглядный пример.

user15189391 10.06.2024 10:49

Вы можете использовать #if DEBUG. Если вы установите режим «release», эта строка не будет скомпилирована. Это вариант для вас?

lorenz albert 10.06.2024 10:50

«Средой разработки» называется отладочная версия. Visual Studio по умолчанию имеет профили отладки и выпуска. Ты их видел? Просто используйте #if DEBUG или #if !DEBUG.

i486 10.06.2024 10:59

@Firrez, ты не объяснил, почему DEBUG недостаточно или даже что ты хочешь сделать. Условная компиляция используется во всех языках, даже до C, и DEBUG является фактическим флагом, используемым во время разработки. Если вы хотите, чтобы какой-то код компилировался даже в сборках RELEASE, используйте другой флаг.

Panagiotis Kanavos 10.06.2024 11:02

@Firrez, что делают эти строки? Могут быть и другие способы контролировать их. Например, трассировка в .NET всегда контролировалась переключателями времени выполнения. Люди не используют Console.WriteLine для отслеживания выполнения программы. Прослушиватели трассировки доступны с 2002 года, и Debug.WriteLine будет отправлять сообщения всем прослушивателям Debug во время отладки (консоль, окно отладки отладчика), но ничего не делать при выпуске. Вы также можете включить или отключить определенные источники трассировки.

Panagiotis Kanavos 10.06.2024 11:06

@Firrez новые версии .NET имеют более новую и лучшую поддержку метрик трассировки и производительности, вплоть до встроенной поддержки OpenTelemetry в .NET (Core) 7 и 8, которая может отправлять события и метрики в инструменты мониторинга, такие как Jaeger и Prometheus. Если вы проверите .NET Aspire, вы увидите, что реальные проекты сервисов и пользовательского интерфейса не имеют специального кода, а только конфигурация, которая отправляет все на панель мониторинга.

Panagiotis Kanavos 10.06.2024 11:11

@PanagiotisKanavos Я никогда не говорил, что DEBUG недостаточно, у меня сложилось впечатление, что это было чисто для режима отладки, но, как указано в моем вопросе. Я не знаком с тем, как это работает.

user15189391 10.06.2024 11:25

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

user15189391 10.06.2024 11:28

@Firrez, тогда ты уже получил ответ, используй #DEBUG или другой символ. Если руководитель вашей группы имеет в виду что-то другое, спросите его, а не гадайте. during development слишком расплывчато. Вы не объяснили свою реальную проблему, заставляя людей гадать. Вы сказали, что впервые знакомы с функцией, которая существует на всех языках, поэтому вполне возможно, что вы пропустили и другие полезные функции.

Panagiotis Kanavos 10.06.2024 11:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
12
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это должно работать:

#if (DEBUG)
    Console.WriteLine("Hello World!")
#endif

Обратите внимание, что вам не нужно (и это не обычно) заключать DEBUG в круглые скобки.

Matthew Watson 10.06.2024 11:49

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

Lex W. 10.06.2024 11:57

Есть два варианта: Либо вы можете добавить условное:

#if (SYMBOL)
// do stuff here that is only compiled when SYMBOL is defined
#endif

SYMBOL вот константа, которая добавляется в конфигурацию компиляции вашего конкретного проекта. По умолчанию проекты имеют две конфигурации: «Отладка» и «Выпуск». оба по умолчанию определяют символы DEBUG и RELEASE соответственно.

Другой вариант — использовать атрибут System.Diagnostics.Conditional. Он работает только с методами с возвращаемым типом void:

[Conditional("!RELEASE")]
void assertMyVector3(in Vector3 vec) {
// The whole method call is not present in a build which defines RELEASE.
// Use it for custom assert macros for example.
  Debug.Assert(float.isFinite(vec.X));
  Debug.Assert(float.isFinite(vec.Y));
  Debug.Assert(float.isFinite(vec.Z));
}

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