В С# это тестовый прогон Debug.Assert в режиме выпуска?
Возьмем следующий пример:
public void Foo()
{
//Code...
Debug.Assert(ExpensiveTest());
//Code...
}
Что происходит с методом Debug.Assert
при компиляции в режиме выпуска? Будет ли еще ExpensiveTest()
работать? Если нет, то как это работает (поскольку это не макрос, который можно установить для оценки ни к чему)? Если он запускается, то разве это не преувеличивает цель утверждений отладки?
Ответы
Ответ 1
Что происходит с методом Debug.Assert при компиляции в режиме выпуска?
Он полностью удален (включая вызов ExpensiveTest
), если у вас нет символа условной компиляции DEBUG
, определенного в вашей конфигурации выпуска.
Если вы посмотрите документацию , в декларации используется [ConditionalAttribute("DEBUG")]
:
[ConditionalAttribute("DEBUG")]
public static void Assert(
bool condition
)
ConditionalAttribute
используется для условной компиляции. См. сообщение в блоге Bart de Smet об условной компиляции для более подробной информации, а также в разделе 17.4.2 спецификации С# 4.
Ответ 2
Утверждения в управляемом коде - MSDN
В Visual Basic и Visual С# вы можете использовать метод Assert из либо Debug или Trace, которые находятся в пространстве имен System.Diagnostics. Методы класса Debug не включены в версию версии вашей программы, поэтому они не увеличивают размер или не уменьшают скорость ваш код выпуска.
Также по той же ссылке:
Обратите внимание, что вызовы метода Debug.Assert исчезают при создании версия версии вашего кода. Это означает, что вызов, который проверяет баланс исчезает в версии Release. Для решения этой проблемы, вы должны заменить Debug.Assert на Trace.Assert, который не исчезнуть в версии Release
Ответ 3
В соответствии с Метод Debug.Assert(Boolean) Debug
скомпилированы только в сборках отладки.
Итак, вы создаете правильную версию сборки (подробнее см. пункт меню Debug/Configuration Manager
) этот метод будет удален.
Ответ 4
Q. В С# - тестовый прогон Debug.Assert в режиме выпуска?
Ответ: "Нет". Из поддержки Microsoft: Как отслеживать и отлаживать в Visual С#:
Вы можете использовать классы Трассировка и Отладка отдельно или вместе в одном приложении. В конфигурации отладочного решения проекта, активны как Трассировка, так и Отладка. Проект генерирует выходные данные из обоих этих классов для всех Listenerобъекты. Тем не менее, только проект конфигурации Release Solution генерирует результат из класса Trace. Решение о выпуске Проект конфигурации игнорирует любые вызовы метода Отладка класса.
В частности, последнее предложение дает понять, что инструкции Debug.Assert()
(а также другие вызовы метода класса Debug) игнорируются в сборке Release.