マネージド コードのアサーションAssertions in Managed Code

アサーション、つまり Assert ステートメントは、条件をテストします。この条件は、Assert ステートメントへの引数として指定します。An assertion, or Assert statement, tests a condition, which you specify as an argument to the Assert statement. 条件が true と評価された場合、アクションは発生しません。If the condition evaluates to true, no action occurs. 条件が false と評価された場合、アサーションは失敗です。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.Diagnostics 名前空間内の AssertAsserts in the System.Diagnostics Namespace

Debug.Assert メソッドThe Debug.Assert method

Debug.Assert の副作用Side effects of Debug.Assert

Trace および Debug の必要条件Trace and Debug Requirements

Assert の引数Assert arguments

Assert の動作のカスタマイズCustomizing Assert behavior

構成ファイルでのアサーションの設定Setting assertions in configuration files

System.Diagnostics 名前空間内の AssertAsserts 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. ただし、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.Assert メソッドThe Debug.Assert method

System.Diagnostics.Debug.Assert メソッドを自由に使用して、コードが正しい場合に true になる条件をテストできます。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. 数学の規則により、0 での除算は不可能です。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.AssertSystem.Diagnostics.Trace.Assert で置き換えます。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.Assert の副作用Side 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 および Debug の必要条件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++

    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. ただし、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.

Assert の引数Assert arguments

System.Diagnostics.Trace.AssertSystem.Diagnostics.Debug.Assert は、最大で 3 つの引数を受け取ります。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. 1 つの引数だけを使用して System.Diagnostics.Trace.Assert(Boolean) または System.Diagnostics.Debug.Assert(Boolean) を呼び出した場合、Assert メソッドによって条件がチェックされ、結果が false である場合は呼び出し履歴の内容が [出力] ウィンドウに出力されます。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 );

2 番目と 3 番目の引数は文字列にする必要があります (存在する場合)。The second and third arguments, if present, must be strings. System.Diagnostics.Trace.Assert または System.Diagnostics.Debug.Assert を 2 つまたは 3 つの引数を使用して呼び出すと、1 番目の引数は条件として処理されます。If you call System.Diagnostics.Trace.Assert or System.Diagnostics.Debug.Assert with two or three arguments, the first argument is a condition. メソッドはこの条件をチェックし、結果が false の場合は 2 番目と 3 番目の文字列を出力します。The method checks the condition and, if the result is false, outputs the second string and third strings. 2 つの引数を使用した 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

Assert の動作のカスタマイズ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 コレクションに追加するか、TraceListenerListeners コレクションから削除します。または、既存の System.Diagnostics.TraceListener.FailTraceListener メソッドをオーバーライドして動作を変更します。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