Поделиться через


Утверждения в управляемом коде

Оператор проверочного утверждения Assert проверяет выполнение условия, указанного в качестве аргумента для оператора Assert. Если условие выполняется, никаких действий не производится. Если же условие не выполняется, то утверждение выдает ошибку. Если вы работаете с отладочной сборкой, программа вводит режим останова.

В этом разделе

Утверждения в пространстве имен System.Diagnostics

Метод Debug.Assert

Побочные эффекты Debug.Assert

Требования к трассировки и отладке

Утверждение аргументов

Настройка поведения утверждений

Настройка утверждений в файлах конфигурации

Утверждения в пространстве имен 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 при удалении. В противном случае вы можете случайно ввести ошибку, которая проявляется только в релизной версии вашей программы. Будьте особенно осторожны с утверждениями, содержащими вызовы функций или процедур, например в следующем примере:

// unsafe code
Debug.Assert (meas(i) != 0 );

Это использование System.Diagnostics.Debug.Assert может казаться безопасным на первый взгляд, но предположим, что функция meas обновляет счетчик при каждом вызове. При сборке финальной версии этот вызов функции meas устраняется, поэтому счетчик не обновляется. Это пример функции с побочным эффектом. Устранение вызова функции, которая имеет побочные эффекты, может привести к ошибке, которая отображается только в версии выпуска. Чтобы избежать таких проблем, не помещайте вызовы функций в инструкцию System.Diagnostics.Debug.Assert . Вместо этого используйте временную переменную:

temp = meas( i );
Debug.Assert ( temp != 0 );

Даже при использовании System.Diagnostics.Trace.Assert может быть желательно избежать размещения вызовов функций внутри инструкции Assert. Такие вызовы должны быть безопасными, так как System.Diagnostics.Trace.Assert инструкции не устраняются в сборке выпуска. Тем не менее, если вы избегаете таких конструкций как вопрос привычки, вы менее вероятно, будете делать ошибку при использовании System.Diagnostics.Debug.Assert.

В этом разделе

Требования к трассировки и отладке

При создании проекта с помощью мастеров Visual Studio символ TRACE определяется по умолчанию как в конфигурациях Release, так и Debug. Символ DEBUG определяется по умолчанию только в сборке отладки.

В противном случае, чтобы Trace методы работали, программа должна иметь одно из следующих элементов в верхней части исходного файла:

Утверждение аргументов

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):

Debug.Assert ( stacksize > 0 );
Trace.Assert ( stacksize > 0 );

Второй и третий аргументы, если они присутствуют, должны быть строками. При вызове 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.