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

Оператор проверочного утверждения Assert проверяет выполнение условия, указанного в качестве аргумента для оператора Assert.An assertion, or Assert statement, tests a condition, which you specify as an argument to the Assert statement. Если условие выполняется, никаких действий не производится.If the condition evaluates to true, no action occurs. Если же условие не выполняется, то утверждение выдает ошибку.If the condition evaluates to false, the assertion fails. При работе с отладочной сборкой выполнение программы приостанавливается.If you are running with a debug build, your program enters break mode.

Содержание разделаIn this topic

Проверочные утверждения в пространстве имен System.DiagnosticsAsserts in the System.Diagnostics Namespace

Метод Debug.AssertThe Debug.Assert method

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

Требования к трассировке и отладкеTrace and Debug Requirements

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

Настройка поведения проверочных утвержденийCustomizing Assert behavior

Использование проверочных утверждений в файлах конфигурацииSetting assertions in configuration files

Проверочные утверждения в пространстве имен System.DiagnosticsAsserts in the System.Diagnostics Namespace

В Visual Basic и Visual C# можно использовать метод Assert из класса Debug или из класса Trace, которые принадлежат пространству имен System.Diagnostics.In Visual Basic and Visual C#, you can use the Assert method from either Debug or Trace, which are in the System.Diagnostics namespace. Методы класса Debug не включаются в версию выпуска программы, поэтому они не увеличивают ее размер и не снижают скорость ее выполнения.Debug class methods are not included in a Release version of your program, so they do not increase the size or reduce the speed of your release code.

C++ не поддерживает методы класса Debug.C++ does not support the Debug class methods. В случае C++ такого же результата можно добиться с помощью класса Trace в сочетании с условной компиляцией, например: #ifdef DEBUG... #endif.You can achieve the same effect by using the Trace class with conditional compilation, such as #ifdef DEBUG... #endif.

Содержание разделаIn this topic

Метод Debug.AssertThe Debug.Assert method

Метод System.Diagnostics.Debug.Assert можно свободно использовать для проверки условий, которые должны выполняться, если код программы написан правильно.Use the System.Diagnostics.Debug.Assert method freely to test conditions that should hold true if your code is correct. Предположим, что имеется функция целочисленного деления.For example, suppose you have written an integer divide function. По правилам математики делитель не может быть равен нулю.By the rules of mathematics, the divisor can never be zero. Проверить выполнение этого условия в имеющейся функции можно при помощи утверждения:You might test this using an assertion:

Function IntegerDivide(ByVal dividend As Integer, ByVal divisor As Integer) As Integer
    Debug.Assert(divisor <> 0)
    Return CInt(dividend / divisor)
End Function
int IntegerDivide ( int dividend , int divisor )
    { Debug.Assert ( divisor != 0 );
        return ( dividend / divisor ); }

При запуске данного кода из отладчика оператор проверочного утверждения вычисляется, но в версию программы для выпуска он не войдет, а значит, не будет создавать дополнительной нагрузки.When you run this code under the debugger, the assertion statement is evaluated, but in the Release version, the comparison is not made, so there is no additional overhead.

Вот другой пример.Here is another example. Пусть имеется класс, описывающий текущий счет:You have a class that implements a checking account, as follows:

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

Прежде чем снять деньги со счета, необходимо удостовериться, что остаток на счете покрывает требуемую сумму.Before you withdraw money from the account, you want to make sure that the account balance is sufficient to cover the amount you are preparing to withdraw. Для проверки остатка на счете можно написать проверочное утверждение:You might write an assertion to check the balance:

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

Обратите внимание, что в версии для выпуска вызов метода System.Diagnostics.Debug.Assert в коде будет отсутствовать.Note that calls to the System.Diagnostics.Debug.Assert method disappear when you create a Release version of your code. Это означает, что в версии для выпуска проверка остатка на счете производиться не будет.That means that the call that checks the balance disappears in the Release version. Чтобы решить эту проблему, следует поменять вызов метода System.Diagnostics.Debug.Assert на вызов метода System.Diagnostics.Trace.Assert, который не исчезнет в версии для выпуска:To solve this problem, you should replace System.Diagnostics.Debug.Assert with System.Diagnostics.Trace.Assert, which does not disappear in the Release version:

Вызовы System.Diagnostics.Trace.Assert создают дополнительную нагрузку в версии выпуска, в отличие от вызовов System.Diagnostics.Debug.Assert.Calls to System.Diagnostics.Trace.Assert add overhead to your Release version, unlike calls to System.Diagnostics.Debug.Assert.

Содержание разделаIn this topic

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

При использовании метода System.Diagnostics.Debug.Assert необходимо убедиться, что код внутри Assert не изменит результатов работы программы, если удалить Assert.When you use System.Diagnostics.Debug.Assert, make sure that any code inside Assert does not change the results of the program if Assert is removed. В противном случае может быть создана ошибка, которая проявится только в версии программы для выпуска.Otherwise, you might accidentally introduce a bug that only shows up in the Release version of your program. Особая осторожность необходима в случае, если проверочное утверждение содержит вызовы функций или процедур, пример которых показан ниже:Be especially careful about asserts that contain function or procedure calls, such as the following example:

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

Такое использование метода System.Diagnostics.Debug.Assert на первый взгляд может показаться безопасным, но предположим, например, что функция meas обновляет счетчик при каждом вызове.This use of System.Diagnostics.Debug.Assert might appear safe at first glance, but suppose the function meas updates a counter each time it is called. При сборке версии для выпуска вызов функции meas исчезнет, а значит, счетчик обновляться не будет.When you build the Release version, this call to meas is eliminated, so the counter does not get updated. Это и есть пример функции, имеющей побочный эффект.This is an example of a function with a side effect. Удаление вызова функции, имеющей побочные эффекты, может создать ошибку, которая проявится только в версии программы для выпуска.Eliminating a call to a function that has side effects could result in a bug that only appears in the Release version. Чтобы избежать подобных проблем, не следует помещать вызовы функций в оператор метода System.Diagnostics.Debug.Assert.To avoid such problems, do not place function calls in a System.Diagnostics.Debug.Assert statement. Вместо этого следует использовать временную переменную:Use a temporary variable instead:

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

Даже при использовании метода System.Diagnostics.Trace.Assert рекомендуется избегать размещения вызовов функций в операторе Assert.Even when you use System.Diagnostics.Trace.Assert, you might still want to avoid placing function calls inside an Assert statement. Такие вызовы, в принципе, безопасны, поскольку операторы System.Diagnostics.Trace.Assert сохраняются в выпускной сборке.Such calls should be safe, because System.Diagnostics.Trace.Assert statements are not eliminated in a Release build. Однако, если взять за правило не использовать подобные конструкции, это снизит вероятность ошибки при использовании метода System.Diagnostics.Debug.Assert.However, if you avoid such constructs as a matter of habit, you are less likely to make a mistake when you use System.Diagnostics.Debug.Assert.

Содержание разделаIn this topic

Требования к трассировке и отладкеTrace and Debug Requirements

Если проект создается с помощью мастеров Visual StudioVisual Studio, символ TRACE определяется по умолчанию и в конфигурации выпуска, и в конфигурации отладки.If you create your project using the Visual StudioVisual Studio wizards, the TRACE symbol is defined by default in both Release and Debug configurations. Символ DEBUG определяется по умолчанию только в отладочной сборке.The DEBUG symbol is defined by default only in the Debug build.

Иначе для работы методов Trace требуется наличие одной из следующих строк в самом начале исходного файла:Otherwise, for Trace methods to work, your program must have one of the following at the top of the source file:

  • #Const TRACE = True — в Visual Basic#Const TRACE = True in Visual Basic

  • #define TRACE — в Visual C# и C++#define TRACE in Visual C# and C++

    Либо, как вариант, построение программы должно выполняться с параметром TRACE:Or your program must be built with the TRACE option:

  • /d:TRACE=True — в Visual Basic/d:TRACE=True in Visual Basic

  • /d:TRACE — в Visual C# и C++/d:TRACE in Visual C# and C++

    Если методы Debug требуется использовать в выпускной сборке программы на языках C# или Visual Basic, необходимо определить символ DEBUG в конфигурации выпуска.If you need to use the Debug methods in a C# or Visual Basic Release build, you must define the DEBUG symbol in your Release configuration.

    C++ не поддерживает методы класса Debug.C++ does not support the Debug class methods. В случае C++ такого же результата можно добиться с помощью класса Trace в сочетании с условной компиляцией, например: #ifdef DEBUG... #endif.You can achieve the same effect by using the Trace class with conditional compilation, such as #ifdef DEBUG... #endif. Эти символы можно задать в диалоговом окне <Проект> Страницы свойств.You can define these symbols in the <Project> Property Pages dialog box. Дополнительные сведения см. в разделе Изменение параметров проекта для конфигурации отладки в Visual Basic или Изменение параметров проекта для конфигурации отладки в C или C++.For more information, see Changing Project Settings for a Visual Basic Debug Configuration or Changing Project Settings for a C or C++ Debug Configuration.

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

Методы System.Diagnostics.Trace.Assert и System.Diagnostics.Debug.Assert принимают до трех аргументов.System.Diagnostics.Trace.Assert and System.Diagnostics.Debug.Assert take up to three arguments. Первый аргумент является обязательным и задает условие, которое требуется проверить.The first argument, which is mandatory, is the condition you want to check. Если вызвать метод System.Diagnostics.Trace.Assert(Boolean) или System.Diagnostics.Debug.Assert(Boolean) только с одним аргументом, то метод Assert проверит условие и, если оно ложно, выведет содержимое стека вызовов в окно Вывод.If you call System.Diagnostics.Trace.Assert(Boolean) or System.Diagnostics.Debug.Assert(Boolean) with only one argument, the Assert method checks the condition and, if the result is false, outputs the contents of the call stack to the Output window. В следующем примере показаны методы System.Diagnostics.Trace.Assert(Boolean) и System.Diagnostics.Debug.Assert(Boolean):The following example shows System.Diagnostics.Trace.Assert(Boolean) and System.Diagnostics.Debug.Assert(Boolean):

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

Второй и третий аргументы, если они присутствуют, должны иметь строковый формат.The second and third arguments, if present, must be strings. Если метод System.Diagnostics.Trace.Assert или System.Diagnostics.Debug.Assert вызывается с двумя или тремя аргументами, первым аргументом является условие.If you call System.Diagnostics.Trace.Assert or System.Diagnostics.Debug.Assert with two or three arguments, the first argument is a condition. Метод проверяет условие и, если результат ложен, выводит вторую и третью строки.The method checks the condition and, if the result is false, outputs the second string and third strings. Ниже показаны примеры использования методов System.Diagnostics.Debug.Assert(Boolean, String) и System.Diagnostics.Trace.Assert(Boolean, String) с двумя аргументами:The following example shows System.Diagnostics.Debug.Assert(Boolean, String) and System.Diagnostics.Trace.Assert(Boolean, String) used with two arguments:

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

В следующем примере показаны методы Assert и Assert:The following example shows Assert and Assert:

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" )
Debug.Assert ( stacksize > 100, "Out of stack space" , "Failed in inctemp" );
Trace.Assert ( stacksize > 0, "Out of stack space", "Failed in inctemp" );

Содержание разделаIn this topic

Настройка поведения проверочных утвержденийCustomizing Assert behavior

Если приложение работает в режиме пользовательского интерфейса, метод Assert отображает диалоговое окно Ошибка в утверждении, если условие не выполняется.If you run your application in user-interface mode, the Assert method displays the Assertion Failed dialog box when the condition fails. Действия, выполняемые при ошибке утверждения, определяются свойствами Listeners и Listeners, соответственно.The actions that occur when an assertion fails are controlled by the Listeners or Listeners property.

Можно настроить поведение при выводе отладочного сообщения путем добавления объекта TraceListener к коллекции Listeners, удаления TraceListener из коллекции Listeners или переопределения метода System.Diagnostics.TraceListener.Fail существующего объекта TraceListener для изменения его поведения.You can customize the output behavior by adding a TraceListener object to the Listeners collection, by removing a TraceListener from the Listeners collection, or by overriding the System.Diagnostics.TraceListener.Fail method of an existing TraceListener to make it behave differently.

Например, можно переопределить метод System.Diagnostics.TraceListener.Fail таким образом, чтобы вместо отображения диалогового окна Ошибка в утверждении производилась запись в журнал событий.For example, you could override the System.Diagnostics.TraceListener.Fail method to write to an event log instead of displaying the Assertion Failed dialog box.

Чтобы можно было настроить поведение программы таким образом, в программе должен быть прослушиватель, причем унаследованный от класса TraceListener и с переопределенным методом System.Diagnostics.TraceListener.Fail.To customize the output in this way, your program must contain a listener, and you must inherit from TraceListener and override its System.Diagnostics.TraceListener.Fail method.

Дополнительные сведения см. в разделе Прослушиватели трассировки.For more Information, see Trace Listeners.

Содержание разделаIn this topic

Использование проверочных утверждений в файлах конфигурацииSetting assertions in configuration files

Проверочные утверждения можно использовать в файле конфигурации программы, так же как и в коде.You can set assertions in your program configuration file as well as in your code. Дополнительные сведения см. в разделе System.Diagnostics.Trace.Assert или System.Diagnostics.Debug.Assert.For more information, see System.Diagnostics.Trace.Assert or System.Diagnostics.Debug.Assert.

См. такжеSee Also