Мне нужно, чтобы несколько строк кода компилировались только в среде разработки. Они помогают в разработке, а их довольно много, поэтому удалить их вручную не вариант.
Если бы вы посмотрели на Conditional Compiling и показалось, что #if было бы хорошим решением. Я новичок в этой концепции и не могу понять, как проверить текущую среду. Я знаю, как это сделать за пределами #if, но доступ внутри него сильно ограничен.
В качестве примера:
#if (Condition)
Console.WriteLine("Hello World!")
#endif
Я хочу, чтобы эта строка компилировалась только в том случае, если я нахожусь в среде разработки.
Если вы хотите отличить сборку в IDE от системы сборки (помимо конфигурации отладки и выпуска), создайте также дополнительные конфигурации.
если вы хотите печатать только во время отладки, я могу порекомендовать вместо этого использовать System.Diagnostics.Debug.WriteLine. В общем, класс Debug содержит множество утилит, которые компилируются только для режимов отладки.
Это не только для печати вещей. Я просто хотел привести наглядный пример.
Вы можете использовать #if DEBUG. Если вы установите режим «release», эта строка не будет скомпилирована. Это вариант для вас?
«Средой разработки» называется отладочная версия. Visual Studio по умолчанию имеет профили отладки и выпуска. Ты их видел? Просто используйте #if DEBUG или #if !DEBUG.
@Firrez, ты не объяснил, почему DEBUG недостаточно или даже что ты хочешь сделать. Условная компиляция используется во всех языках, даже до C, и DEBUG является фактическим флагом, используемым во время разработки. Если вы хотите, чтобы какой-то код компилировался даже в сборках RELEASE, используйте другой флаг.
@Firrez, что делают эти строки? Могут быть и другие способы контролировать их. Например, трассировка в .NET всегда контролировалась переключателями времени выполнения. Люди не используют Console.WriteLine для отслеживания выполнения программы. Прослушиватели трассировки доступны с 2002 года, и Debug.WriteLine будет отправлять сообщения всем прослушивателям Debug во время отладки (консоль, окно отладки отладчика), но ничего не делать при выпуске. Вы также можете включить или отключить определенные источники трассировки.
@Firrez новые версии .NET имеют более новую и лучшую поддержку метрик трассировки и производительности, вплоть до встроенной поддержки OpenTelemetry в .NET (Core) 7 и 8, которая может отправлять события и метрики в инструменты мониторинга, такие как Jaeger и Prometheus. Если вы проверите .NET Aspire, вы увидите, что реальные проекты сервисов и пользовательского интерфейса не имеют специального кода, а только конфигурация, которая отправляет все на панель мониторинга.
@PanagiotisKanavos Я никогда не говорил, что DEBUG недостаточно, у меня сложилось впечатление, что это было чисто для режима отладки, но, как указано в моем вопросе. Я не знаком с тем, как это работает.
@PanagiotisKanavos Вы увлеклись чем-то неуместным, код следует оставить в покое, не по моему выбору, а по решению моего начальства, я должен только следить за тем, чтобы он компилировался только во время разработки.
@Firrez, тогда ты уже получил ответ, используй #DEBUG или другой символ. Если руководитель вашей группы имеет в виду что-то другое, спросите его, а не гадайте. during development слишком расплывчато. Вы не объяснили свою реальную проблему, заставляя людей гадать. Вы сказали, что впервые знакомы с функцией, которая существует на всех языках, поэтому вполне возможно, что вы пропустили и другие полезные функции.





Это должно работать:
#if (DEBUG)
Console.WriteLine("Hello World!")
#endif
Обратите внимание, что вам не нужно (и это не обычно) заключать DEBUG в круглые скобки.
Мэттью, ты прав. Я только что отредактировал код, предоставленный ОП, включая круглые скобки. Но на самом деле их можно опустить.
Есть два варианта: Либо вы можете добавить условное:
#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));
}
Придумайте подходящее имя символа и введите его в поле «Пользовательский символ» ваших проектов. Затем проверьте с помощью #if этот символ.