Утверждения в управляемом коде
Оператор проверочного утверждения Assert
проверяет выполнение условия, указанного в качестве аргумента для оператора Assert
. Если условие выполняется, никаких действий не производится. Если же условие не выполняется, то утверждение выдает ошибку. Если вы работаете с отладочной сборкой, программа переходит в режим прерывания.
В этом разделе
Проверочные утверждения в пространстве имен System.Diagnostics
Побочные эффекты метода Debug.Assert
Требования к трассировке и отладке
Настройка поведения проверочных утверждений
Использование проверочных утверждений в файлах конфигурации
Проверочные утверждения в пространстве имен System.Diagnostics
В Visual Basic и Visual C# можно использовать метод Assert
из класса Debug или из класса Trace, которые принадлежат пространству имен System.Diagnostics. Debug Методы класса не включены в версию выпуска программы, поэтому они не увеличивают размер или снижают скорость кода выпуска.
C++ не поддерживает Debug методы класса. В случае C++ такого же результата можно добиться с помощью класса Trace в сочетании с условной компиляцией, например: #ifdef DEBUG
... #endif
.
Метод Debug.Assert
Метод System.Diagnostics.Debug.Assert можно свободно использовать для проверки условий, которые должны выполняться, если код программы написан правильно. Предположим, что имеется функция целочисленного деления. По правилам математики делитель не может быть равен нулю. Проверить выполнение этого условия в имеющейся функции можно при помощи утверждения:
int IntegerDivide ( int dividend , int divisor )
{
Debug.Assert ( divisor != 0 );
return ( dividend / divisor );
}
При запуске данного кода из отладчика оператор проверочного утверждения вычисляется, но в версию программы для выпуска он не войдет, а значит, не будет создавать дополнительной нагрузки.
Вот другой пример. Пусть имеется класс, описывающий текущий счет:
float balance = savingsAccount.Balance;
Debug.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );
Прежде чем вы снимаете деньги с счета, вы хотите убедиться, что баланс счета достаточно, чтобы покрыть сумму, которую вы готовитесь снять. Для проверки остатка на счете можно написать проверочное утверждение:
float balance = savingsAccount.Balance;
Trace.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );
Обратите внимание, что в версии для выпуска вызов метода System.Diagnostics.Debug.Assert в коде будет отсутствовать. Это означает, что в версии для выпуска проверка остатка на счете производиться не будет. Чтобы решить эту проблему, следует заменить System.Diagnostics.Debug.Assert System.Diagnostics.Trace.Assertна , которая не исчезает в версии выпуска:
Вызовы System.Diagnostics.Trace.Assert создают дополнительную нагрузку в версии выпуска, в отличие от вызовов System.Diagnostics.Debug.Assert.
Побочные эффекты метода Debug.Assert
При использовании System.Diagnostics.Debug.Assertубедитесь, что любой код внутри Assert
не изменяет результаты программы Assert
при удалении. В противном случае может быть создана ошибка, которая проявится только в версии программы для выпуска. Особая осторожность необходима в случае, если проверочное утверждение содержит вызовы функций или процедур, пример которых показан ниже:
Такое использование метода System.Diagnostics.Debug.Assert на первый взгляд может показаться безопасным, но предположим, например, что функция meas обновляет счетчик при каждом вызове. При сборке версии выпуска этот вызов meas устраняется, поэтому счетчик не обновляется. Это и есть пример функции, имеющей побочный эффект. Удаление вызова функции, имеющей побочные эффекты, может создать ошибку, которая проявится только в версии программы для выпуска. Чтобы избежать таких проблем, не помещайте вызовы функций в инструкцию System.Diagnostics.Debug.Assert . Вместо этого следует использовать временную переменную:
Даже при использовании метода System.Diagnostics.Trace.Assert рекомендуется избегать размещения вызовов функций в операторе Assert
. Такие вызовы должны быть безопасными, так как System.Diagnostics.Trace.Assert инструкции не устраняются в сборке выпуска. Тем не менее, если вы избегаете таких конструкций как вопрос привычки, вы менее вероятно, будете делать ошибку при использовании System.Diagnostics.Debug.Assert.
Требования к трассировке и отладке
Если проект создается с помощью мастеров Visual Studio, символ TRACE определяется по умолчанию и в конфигурации выпуска, и в конфигурации отладки. Символ DEBUG определяется по умолчанию только в отладочной сборке.
Иначе для работы методов Trace требуется наличие одной из следующих строк в самом начале исходного файла:
#Const TRACE = True
— в Visual Basic#define TRACE
— в Visual C# и C++Либо, как вариант, построение программы должно выполняться с параметром TRACE:
/d:TRACE=True
— в Visual Basic/d:TRACE
— в Visual C# и C++Если методы Debug требуется использовать в выпускной сборке программы на языках C# или Visual Basic, необходимо определить символ DEBUG в конфигурации выпуска.
C++ не поддерживает Debug методы класса. В случае C++ такого же результата можно добиться с помощью класса Trace в сочетании с условной компиляцией, например:
#ifdef DEBUG
...#endif
. Эти символы можно определить в диалоговом окне Страницы свойств <Проект>. Дополнительные сведения см. в разделе Изменение параметров проекта для конфигурации отладки в Visual Basic или Изменение параметров проекта для конфигурации отладки в C или C++.
Аргументы методов Assert
Методы System.Diagnostics.Trace.Assert и System.Diagnostics.Debug.Assert принимают до трех аргументов. Первый аргумент является обязательным и задает условие, которое требуется проверить. Если вызвать метод System.Diagnostics.Trace.Assert(Boolean) или System.Diagnostics.Debug.Assert(Boolean) только с одним аргументом, то метод Assert
проверит условие и, если оно ложно, выведет содержимое стека вызовов в окно Вывод. В следующем примере показаны методы System.Diagnostics.Trace.Assert(Boolean) и System.Diagnostics.Debug.Assert(Boolean):
Второй и третий аргументы, если они присутствуют, должны иметь строковый формат. Если метод System.Diagnostics.Trace.Assert или System.Diagnostics.Debug.Assert вызывается с двумя или тремя аргументами, первым аргументом является условие. Метод проверяет условие и, если результат ложен, выводит вторую и третью строки. Ниже показаны примеры использования методов System.Diagnostics.Debug.Assert(Boolean, String) и System.Diagnostics.Trace.Assert(Boolean, String) с двумя аргументами:
Debug.Assert ( stacksize > 0, "Out of stack space" );
Trace.Assert ( stacksize > 0, "Out of stack space" );
Ниже показаны примеры использования методов System.Diagnostics.Debug.Assert(Boolean, String, String) и System.Diagnostics.Trace.Assert(Boolean, String, String) с тремя аргументами:
Debug.Assert ( stacksize > 100, "Out of stack space" , "Failed in inctemp" );
Trace.Assert ( stacksize > 0, "Out of stack space", "Failed in inctemp" );
Настройка поведения проверочных утверждений
При запуске приложения в режиме Assert
пользовательского интерфейса метод отображает диалоговое окно "Сбой утверждения" при сбое условия. Действия, выполняемые при ошибке утверждения, определяются свойствами Listeners и Listeners, соответственно.
Можно настроить поведение при выводе отладочного сообщения путем добавления объекта TraceListener к коллекции Listeners
, удаления TraceListener из коллекции Listeners
или переопределения метода System.Diagnostics.TraceListener.Fail существующего объекта TraceListener
для изменения его поведения.
Например, можно переопределить метод System.Diagnostics.TraceListener.Fail таким образом, чтобы вместо отображения диалогового окна Ошибка в утверждении производилась запись в журнал событий.
Чтобы можно было настроить поведение программы таким образом, в программе должен быть прослушиватель, причем унаследованный от класса TraceListener и с переопределенным методом System.Diagnostics.TraceListener.Fail.
Дополнительные сведения см. в разделе Прослушиватели трассировки.
Использование проверочных утверждений в файлах конфигурации
Проверочные утверждения можно использовать в файле конфигурации программы, так же как и в коде. Дополнительные сведения см. в разделе System.Diagnostics.Trace.Assert или System.Diagnostics.Debug.Assert.