マネージド コードのアサーション

アサーション、つまり Assert ステートメントは、条件をテストします。この条件は、Assert ステートメントへの引数として指定します。 条件が true と評価された場合、アクションは発生しません。 条件が false と評価された場合、アサーションは失敗です。 デバッグ ビルドで実行している場合、プログラムは中断モードになります。

このトピックの内容は以下のとおりです。

System.Diagnostics 名前空間のアサート

Debug.Assert メソッド

Debug.Assert の副作用

トレースとデバッグの要件

引数を確認する

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 メソッドを自由に使用して、コードが正しい場合に true になる条件をテストできます。 たとえば、整数除算関数を記述したとします。 数学の規則により、0 での除算は不可能です。 これは、アサーションを使用してテストできます。

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

デバッガーでこのコードを実行すると、アサーション ステートメントが評価されますが、リリース バージョンでは比較が行われないため、追加のオーバーヘッドはありません。

別の例を次に示します。 次のように、チェック アカウントを実装するクラスがあります。

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.AssertSystem.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 シンボルはリリース構成とデバッグ構成の両方で既定で定義されます。 DEBUG シンボルは、デバッグ ビルドでのみ既定で定義されます。

それ以外の場合、 Trace メソッドを機能させるには、プログラムのソース ファイルの先頭に次のいずれかが必要です。

  • #Const TRACE = True Visual Basic の場合

  • #define TRACE Visual C# と C++ の場合

    または、TRACE オプションを使用してプログラムをビルドする必要があります。

  • /d:TRACE=True Visual Basic の場合

  • /d:TRACE Visual C# と C++ の場合

    C# または Visual Basic リリース ビルドで Debug メソッドを使用する必要がある場合は、リリース構成で DEBUG シンボルを定義する必要があります。

    C++ では、 Debug クラス メソッドはサポートされていません。 Trace... #ifdef DEBUGなど、条件付きコンパイルで #endif クラスを使用すると、同じ効果を得ることができます。 これらのシンボルは、[ <Project> プロパティ ページ ] ダイアログ ボックスで定義できます。 詳細については、「 Visual Basic デバッグ構成のプロジェクト設定の変更 」または「 C または C++ デバッグ構成のプロジェクト設定の変更」を参照してください

Assert 引数

System.Diagnostics.Trace.AssertSystem.Diagnostics.Debug.Assert は最大 3 つの引数を取ります。 最初の引数 (必須) は、チェックする条件です。 System.Diagnostics.Trace.Assert(Boolean)を呼び出すか、引数を 1 つだけ指定して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 );

2 番目と 3 番目の引数 (存在する場合) は文字列である必要があります。 2 つまたは 3 つの引数を使用して System.Diagnostics.Trace.Assert または System.Diagnostics.Debug.Assert を呼び出す場合、最初の引数は条件です。 このメソッドは条件をチェックし、結果が false の場合は、2 番目の文字列と 3 番目の文字列を出力します。 次の例は、2 つの引数で使用される 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" );

次の例は、3 つの引数で使用される 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.FailTraceListener メソッドをオーバーライドして動作を異なるようにすることで、出力動作をカスタマイズできます。

たとえば、 System.Diagnostics.TraceListener.Fail メソッドをオーバーライドして、[ アサーションに失敗しました ] ダイアログ ボックスを表示するのではなく、イベント ログに書き込みます。

この方法で出力をカスタマイズするには、プログラムにリスナーが含まれている必要があり、 TraceListener から継承し、その System.Diagnostics.TraceListener.Fail メソッドをオーバーライドする必要があります。

詳細については、「 トレース リスナー」を参照してください。

このトピックの内容

構成ファイルでのアサーションの設定

アサーションは、プログラム構成ファイルとコードで設定できます。 詳細については、System.Diagnostics.Trace.Assert または System.Diagnostics.Debug.Assertを参照してください。