.net - скрипт - рабочая область google tag manager




Компилятор.NET-DEBUG против RELEASE (5)

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

[Conditional("DEBUG")]

атрибут.

Справка MSDN для состояний ConditionalAttribute :

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

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

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


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

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

Записывает информацию об отладке слушателям трассировки в коллекции Listeners.

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

#if DEBUG
    System.Diagnostics.Debug.Write(...);
#endif

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

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

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

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


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

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

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

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

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

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





debugging