Подтвердить что ты не робот

В С# это тестовый прогон Debug.Assert в режиме выпуска?

Возьмем следующий пример:

public void Foo()
{
    //Code...

    Debug.Assert(ExpensiveTest());

    //Code...
}

Что происходит с методом Debug.Assert при компиляции в режиме выпуска? Будет ли еще ExpensiveTest() работать? Если нет, то как это работает (поскольку это не макрос, который можно установить для оценки ни к чему)? Если он запускается, то разве это не преувеличивает цель утверждений отладки?

4b9b3361

Ответ 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.