Компилятор .NET - ОТЛАДКА против ВЫПУСКА

В течение многих лет я использовал константу компилятора DEBUG в VB.NET для записи сообщений на консоль. Я также использовал System.Diagnostics.Debug.Write аналогичным образом. Я всегда понимал, что, когда RELEASE использовался в качестве опции сборки, все эти операторы были исключены компилятором, освобождая производственный код от накладных расходов на операторы отладки. Недавно, работая с Silverlight 2 Beta 2, я заметил, что Visual Studio фактически прикреплена к сборке RELEASE, которую я запускал с общедоступного веб-сайта, и отображала операторы DEBUG, которые, как я предполагал, даже не были скомпилированы! Теперь я в первую очередь склоняюсь к предположению, что с моей средой что-то не так, но я также хочу спросить любого, кто обладает глубокими знаниями о System.Diagnostics.Debug и параметре сборки DEBUG в целом, что я могу здесь неправильно понять.

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
18
0
11 611
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

Использование Release определенно не удалит операторы System.Diagnostics.Debug.Write.

Они не то же самое; и режим Release по умолчанию действительно удаляет вызовы Debug.Write из-за того, что к методу применен ConditionalAttribute.

Robert Taylor 12.10.2008 01:21

Что я делаю, так это инкапсулирую вызов Debug в моем собственном классе и добавляю директиву прекомпилятора

public void Debug(string s)
{
#if DEBUG
    System.Diagnostics.Debug(...);
#endif
}

Использование символа компилятора DEBUG, как вы сказали, фактически исключает код из сборки.

Я считаю, что System.Diagnostics.Debug.Write всегда будет выводить в подключенный отладчик, даже если вы построили в режиме Release. Согласно Статья MSDN:

Writes information about the debug to the trace listeners in the Listeners collection.

Если вам не нужен вывод любой, вам нужно обернуть свой вызов в Debug. Запишите константу DEBUG, как сказал Хуан:

#if DEBUG
    System.Diagnostics.Debug.Write(...);
#endif
Ответ принят как подходящий

Предпочтительный метод - это фактическое использование условного атрибута для обертывания ваших отладочных вызовов, а не использование директив компилятора. #ifs может оказаться сложным и привести к странным проблемам при сборке.

Пример использования условного атрибута следующий (в C#, но работает и в VB.NET):

[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

Когда вы компилируете без установленного флага DEBUG, любой вызов WriteDebug будет удален, как предполагалось, происходило с Debug.Write ().

Я думаю, что использование ConditionalAttribute означает, что метод по-прежнему является частью фактической сборки выпуска, он просто не загружен. Итак, я могу представить, что единственный способ удаления кода отладки с помощью истинный - использовать директивы компилятора?

James 19.01.2012 18:19

Я тоже прочитал эту статью, и это заставило меня поверить, что, когда DEBUG не был определен, ConditionalAttribute, объявленный в функциях System.Debug, заставит компилятор полностью исключить этот код. Я полагаю, что то же самое можно сказать и о TRACE. То есть функции System.Diagnostics.Debug должны иметь ConditionalAttributes для DEBUG и для TRACE. Я ошибался в этом предположении. Отдельный класс Trace имеет те же функции, и они определяют ConditionalAttribute, зависящий от константы TRACE.

Из System.Diagnostics.Debug: _ Общедоступная общая дополнительная запись (_ сообщение как строка _ )

Из System.Diagnostics.Trace: _ Общедоступная общая дополнительная линия записи (_ сообщение как строка _ )

Тогда кажется, что мое первоначальное предположение было правильным, что операторы System.Diagnostics.Debug (или system.Diagnostics.Trace) на самом деле не включаются в компиляцию, как если бы они были включены в регионы #IF DEBUG (или #IF TRACE).

Но я также узнал здесь от вас, ребята, и подтвердил, что сборка RELEASE сама по себе не заботится об этом. По крайней мере, с проектами Silverlight, которые все еще немного нестабильны, вам нужно войти в «Расширенные параметры компиляции ...» и убедиться, что DEBUG не определен.

Мы перешли с .NET 1.1 / VS2003 на .NET 3.5 / VS2008, поэтому я думаю, что некоторые из них работали по-другому, но, возможно, это изменилось в 2.0 / VS2005.

Изучите метод Debug.Write. Он отмечен значком

[Conditional("DEBUG")]

атрибут.

В справке MSDN для ConditionalAttribute указано:

Indicates to compilers that a method call or attribute should be ignored unless a specified conditional compilation symbol is defined.

Имеет ли конфигурация сборки метку выпуска или отладки, не имеет значения, важно, определен ли в ней символ DEBUG.

Чтобы выбрать, хотите ли вы, чтобы отладочная информация была скомпилирована или удалена,

перейдите на вкладку «Сборка» в окне свойств проекта.

Выберите правильную конфигурацию (Active / Release / Debug / All) и убедитесь, что вы проверьте "DEBUG Constant", если вам нужна информация, или снимите флажок, если нет.

Применить изменения и перестроить

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