Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Оператор проверочного утверждения Assert
проверяет выполнение условия, указанного в качестве аргумента для оператора Assert
. Если условие выполняется, никаких действий не производится. Если же условие не выполняется, то утверждение выдает ошибку. Если вы работаете с отладочной сборкой, программа вводит режим останова.
В этом разделе
Утверждения в пространстве имен System.Diagnostics
Требования к трассировки и отладке
Настройка поведения утверждений
Настройка утверждений в файлах конфигурации
Утверждения в пространстве имен System.Diagnostics
В Visual Basic и Visual C# можно использовать метод Assert
из либо Debug, либо Trace, которые находятся в System.Diagnostics пространстве имен.
Debug Методы класса не включены в версию выпуска программы, поэтому они не увеличивают размер или снижают скорость кода выпуска.
C++ не поддерживает Debug методы класса. Вы можете добиться того же эффекта, используя класс с условной Trace компиляцией, например #ifdef DEBUG
... #endif
.
Метод Debug.Assert
Используйте метод System.Diagnostics.Debug.Assert без ограничений для проверки условий, которые должны быть истинными, если ваш код правильный. Например, предположим, что вы написали целочисленную функцию деления. По правилам математики делитель никогда не может быть нулевым. Это можно проверить с помощью утверждения:
int IntegerDivide ( int dividend , int divisor )
{
Debug.Assert ( divisor != 0 );
return ( dividend / divisor );
}
При выполнении этого кода в отладчике вычисляется assert-выражение, но в Release версии оно не оценивается, поэтому дополнительной нагрузки нет.
Вот еще один пример. У вас есть класс, реализующий чековый счет, как показано ниже.
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 определяется по умолчанию как в конфигурациях Release, так и Debug. Символ DEBUG определяется по умолчанию только в сборке отладки.
В противном случае, чтобы Trace методы работали, программа должна иметь одно из следующих элементов в верхней части исходного файла:
#Const TRACE = True
в Visual Basic#define TRACE
в Visual C# и C++Или программа должна быть создана с помощью параметра TRACE:
/d:TRACE=True
в Visual Basic/d:TRACE
в Visual C# и C++Если необходимо использовать методы Debug в сборке Release C# или Visual Basic, необходимо определить символ DEBUG в конфигурации Release.
C++ не поддерживает Debug методы класса. Вы можете добиться того же эффекта, используя класс с условной Trace компиляцией, например
#ifdef DEBUG
...#endif
. Эти символы можно определить в <диалоговом окне "Страницы свойств проекта>". Дополнительные сведения см. в разделе "Изменение параметров проекта" для конфигурации отладки Visual Basic или изменения параметров проекта для конфигурации отладки C или C++.
Утверждение аргументов
System.Diagnostics.Trace.Assert и System.Diagnostics.Debug.Assert занимает до трех аргументов. Первый аргумент, который является обязательным, — это условие, которое требуется проверить. Если вы вызываете System.Diagnostics.Trace.Assert(Boolean) или System.Diagnostics.Debug.Assert(Boolean) с одним аргументом, метод Assert
проверяет условие и, если результат равен false, выводит содержимое стека вызовов в окно Вывода. В следующем примере показано System.Diagnostics.Trace.Assert(Boolean) и System.Diagnostics.Debug.Assert(Boolean):
Второй и третий аргументы, если они присутствуют, должны быть строками. При вызове System.Diagnostics.Trace.Assert или System.Diagnostics.Debug.Assert с двумя или тремя аргументами первый аргумент является условием. Метод проверяет условие и, если результат имеет значение false, выводит вторую строку и третие строки. В следующем примере показано использование 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
При запуске приложения в режиме 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.