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


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

Этот раздел применим к:

Выпуск

Visual Basic

C#

C++

Web Developer

Express

Тема применяется Тема применяется Тема не применяется Тема применяется

Pro, Premium и Ultimate

Тема применяется Тема применяется Тема не применяется Тема применяется

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

В Visual Basic и Visual C# можно использовать метод Assert из Debug или из Trace, которые находятся в пространстве имен System.Diagnostics. Методы класса Debug не включаются в окончательную версию программы, поэтому они не увеличивают размер и не уменьшают скорость кода выпуска.

C++ не поддерживает методы класса Debug. Можно добиться того же результата с помощью класса Trace в сочетании с условной компиляцией, например: #ifdef DEBUG... #endif.

Метод Debug.Assert

Метод Debug.Assert используется для проверки условий, которые должны выполняться, если код программы написан правильно. Предположим, что имеется функция целочисленного деления. По законам математики делитель не может быть равен нулю. Проверить выполнение этого условия в имеющейся функции можно при помощи утверждения:

[Visual Basic]

Function IntegerDivide(ByVal dividend As Integer, ByVal divisor As Integer) As Integer
    Debug.Assert(divisor <> 0)
    Return CInt(dividend / divisor)
End Function

[C#]

int IntegerDivide ( int dividend , int divisor )
    { Debug.Assert ( divisor != 0 );
        return ( dividend / divisor ); }

При запуске данного кода из отладчика инструкция утверждения вычисляется, но в окончательный выпуск программы проверка не войдет, а значит, не будет дополнительных издержек.

Вот другой пример. Пусть имеется класс, описывающий текущий счет:

[Visual Basic]

Dim amount, balance As Double
balance = savingsAccount.balance
Debug.Assert(amount <= balance)
SavingsAccount.Withdraw(amount)

[C#]

float balance = savingsAccount.Balance;
Debug.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

Прежде чем забрать деньги со счета, необходимо удостовериться, что остаток на счете покрывает требуемую сумму. Для проверки остатка на счете можно написать утверждение:

[Visual Basic]

Dim amount, balance As Double
balance = savingsAccount.balance
Trace.Assert(amount <= balance)
SavingsAccount.Withdraw(amount)

[C#]

float balance = savingsAccount.Balance;
Trace.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

Обратите внимание, что метод Debug.Assert исчезает при создании окончательной версии кода. Это означает, что в окончательном выпуске программы не будет проверки остатка на счете. Чтобы решить эту проблему, необходимо заменить Debug.Assert на Trace.Assert, которая не исчезнет в окончательном выпуске:

Вызов Trace.Assert увеличит объем служебных данных в окончательном выпуске, в отличие от вызовов Debug.Assert.

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

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

[Visual Basic]

' unsafe code
Debug.Assert (meas(i) <> 0 )

[C#]

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

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

[Visual Basic]

temp = meas( i )
Debug.Assert (temp <> 0)

[C#]

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

Даже при использовании Trace.Assert, по-прежнему может быть необходимо избегать размещения вызовов функций в теле Assert. Такие вызовы будут безопасны, поскольку операторы Trace.Assert остаются в окончательном выпуске программы. Однако, если взять за правило не использовать подобные конструкции, это снизит вероятность ошибки при использовании метода 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. Можно добиться того же результата с помощью класса Trace в сочетании с условной компиляцией, например: #ifdef DEBUG... #endif. Эти символы можно задать в диалоговом окне Страницы свойств: <проект>. Дополнительные сведения см. в разделе Изменение параметров проекта для конфигурации отладки в Visual Basic или Изменение параметров проекта для конфигурации отладки в C или C++.

Аргументы методов Assert

Trace.Assert и Debug.Assert принимают до трех аргументов. Первый аргумент является обязательным и задает условие, которое требуется проверить. Если вызвать метод Trace.Assert(Boolean) или Debug.Assert(Boolean) только с одним аргументом, то метод Assert проверит условие и, если оно ложно, выведет содержимое стека вызовов в окно Выходные данные. В следующем примере показаны Trace.Assert(Boolean) и Debug.Assert(Boolean):

[Visual Basic]

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

[C#]

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

Второй и третий аргументы, если они присутствуют, должны иметь строковый формат. Если вызывать методы Trace.Assert или Debug.Assert с двумя или тремя аргументами, первым аргументом является условие. Метод проверяет условие и, если результат ложен, выводит вторую и третью строки. В следующем примере показаны Debug.Assert(Boolean, String) и Trace.Assert(Boolean, String), используемые с двумя аргументами:

[Visual Basic]

Debug.Assert(stacksize > 0, "Out of stack space")
Trace.Assert(stacksize > 0, "Out of stack space")

[C#]

Debug.Assert ( stacksize > 0, "Out of stack space" );
Trace.Assert ( stacksize > 0, "Out of stack space" );

В следующем примере показаны Assert и Assert:

[Visual Basic]

Debug.Assert(stacksize > 0, "Out of stack space. Bytes left:" , Format(size, "G"))
Trace.Assert(stacksize > 0, "Out of stack space. Bytes left:" , Format(size, "G"))
Trace.Assert(stacksize > 0, "Out of stack space. Bytes left:", "inctemp failed on third call" )

[C#]

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 или переопределения метода TraceListener.Fail существующих TraceListener, чтобы изменить их поведение.

Например, можно переопределить метод TraceListener.Fail для записи в журнал событий вместо вывода диалогового окна Ложное утверждение.

Для такой настройки поведения при выводе отладочного сообщения в программе должен быть прослушиватель, причем унаследованный от класса TraceListener и с переопределенным методом TraceListener.Fail.

Дополнительные сведения см. в разделе Прослушиватели трассировки.

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

Можно задать отладочные утверждения в файле конфигурации программы, также как и в коде. Дополнительные сведения см. в разделе Trace.Assert или Debug.Assert.

См. также

Задачи

Практическое руководство. Условная компиляция с использованием атрибутов Trace и Debug

Ссылки

Debug.Assert

Trace.Assert

Основные понятия

Безопасность отладчика

Другие ресурсы

Трассировка и оборудование приложений

Подготовка к отладке: типы проектов C#, F# и Visual Basic

Отладка управляемого кода