|
|
連載
改訂版
プロフェッショナルVB.NETプログラミング
Chapter 03 ステートメントの変化
株式会社ピーデー
川俣 晶
2004/03/17 |
|
|
VB 6のDebugオブジェクトは、本連載のサンプル・ソースでも多用している。しかし、Debugオブジェクトが使用されても、そのメソッドの中で呼び出すのはPrintメソッドだけということも多い。だが、Debugオブジェクトにはもう1つ、Assertというメソッドが存在する。では、このAssertを用いたVB 6のソースは、VB.NETではどうすればよいのだろうか?
まず、Debug.Assertを使用したソースを記述してみた(リスト3-61)。
1: Private Sub Form_Load()
2: Dim i As Integer, j As Integer
3: For i = -10 To 10
4: Debug.Assert i <> 0
5: j = j + 100 / i
6: Next
7: Debug.Print j
8: End Sub
|
|
リスト3-61 Debug.Assertを使用したプログラム
|
これを実行すると以下のようになる。
|
●図3-62 リスト3-61の実行結果 |
このように、Debug.Assertを実行する際、指定された式が成立していないと、そこで開発環境にブレークを掛けてくれる。この機能は、デバッグ中のブレークポイントとして使うというよりも、誤った値のままプログラムが進行することを未然に防ぎ、バグをすばやく察知するためにソースの各所に埋め込むものである。例えば、メソッドを自分で記述する際、指定してよい値に限定された範囲があるとき、その範囲のチェックをDebug.Assertを用いてメソッドの先頭に入れておくことができる。こうしておけば、メソッドを作成したプログラマーが意図しない値が引数に指定されて実行されると、Debug.Assertメソッドが察知してくれるというわけである。
では、このソースをVB.NET用に書き換えるには、どうしたらよいだろうか?
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim i, j As Integer
3: For i = -10 To 10
4: Trace.Assert(i <> 0)
5: j = j + 100 / i
6: Next
7: Trace.WriteLine(j)
8: End Sub
|
|
リスト3-63 Trace.Assertメソッドを用いてリスト3-61を書き換えたVB.NETのプログラム
|
結論からいえば、Debug.Assertメソッドの代わりに、Trace.Assertメソッドを使えば意図する結果が得られる。基本的に難しい話ではない。しかし、コードの書き換えは簡単でも、それが及ぼす効果が違う。
これを実行すると以下のようになる。
|
●図3-64 リスト3-63の実行結果 |
つまり、発生位置のソースファイル名や行番号を含む呼び出し履歴相当の情報がダイアログボックスに表示され、実行を中止するか、デバッガに入るか、無視して継続するかを選択できるようになった。
これだけなら、VB 6でも、ブレーク状態に入れば、ほかのウィンドウで閲覧できる情報ばかりである。ありがたみがないかのように思えるかもしれないが、実はそうではない。VB 6のDebug.Assertと、VB.NETのTrace.Assertでは、決定的な相違が存在するのである。それは、EXEファイルを作成後にそれを実行した場合、VB 6のDebug.Assertは何も存在しなかったかのように扱われるのに対して、VB.NETのTrace.Assertでは機能を維持しているということである。VB 6では、開発環境内で実行した場合のみDebug.Assertによる中断が発生するが、VB.NETでは開発環境内でも外でも中断が発生する。開発環境外で実行したときにもダイアログボックスにさまざまな情報が表示されるのは、デバッグ情報を得るという意味で有益な機能といえる。
だが、常時その機能が有効ということになると、困る場合もあるだろう。もし、デバッグ中だけ有効であってほしい、つまり出荷版では無効になってほしいと思うなら、以下のように記述することができる(リスト3-65)。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim i, j As Integer
3: For i = -10 To 10
4: Debug.Assert(i <> 0)
5: j = j + 100 / i
6: Next
7: Trace.WriteLine(j)
8: End Sub
|
|
リスト3-65 リスト3-63のTrace.AssertをDebug.Assertに書き換えたプログラム
|
このソース・コードは、Debugビルドの場合と、Releaseビルドの場合で、異なる結果になる。Debugビルドの場合は以下のようになる。
|
●図3-66 リスト3-65の実行結果(Debugビルドの場合) |
Releaseビルドの場合は以下のようになる。
|
●図3-67 リスト3-65の実行結果(Releaseビルドの場合) |
ソース・コードを見ると、変更点は、Trace.AssertをDebug.Assertに書き換えただけである。Debug.Assertは、VB 6のものと、くしくも同名ということになるが、機能は同じではない。VB.NETの(より正確にはクラス・ライブラリの)TraceクラスとDebugクラスはほぼ同じ機能を持っているが、機能が有効になる条件が異なっている。DebugクラスはDebugビルドの場合のみ機能を発揮するが、Traceクラスはビルドの種類に関係なく機能を発揮する。これは、WriteLineなどのほかのメソッドでも同じことがいえる。DebugクラスのWriteLineメソッドは、TraceクラスのWriteLineメソッドと同様の働きを行うが、あくまでDebugビルドの場合のみである(TraceクラスとDebugクラスの相違も参照)。
さて、VB 6のDebug.AssertメソッドとVB.NETのTrace.Assert(およびDebug.Assert)が等価ではない点がもう1つある。それは、説明のための文字列を付加できるかどうかという点である。リスト3-68は、VB.NETのTrace.Assertに説明のための文字列を追加した例である。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim i, j As Integer
3: For i = -10 To 10
4: Trace.Assert(i <> 0, "i <> 0", "除算のため変数iはゼロでなければなりません")
5: j = j + 100 / i
6: Next
7: Trace.WriteLine(j)
8: End Sub
|
|
リスト3-68 Trace.Assertに説明のための文字列を追加したプログラム
|
これを実行すると次のようになる。
|
▲図3-69 リスト3-68の実行結果 |
Assertメソッドは引数1つ、2つ、3つのバリエーションがある。引数1つの場合は、単純に、判定させたい式を記述することしかできない。2つの場合は簡単な説明文字列を付加することができる。3つの場合は、説明の文字列を2つ付加することができ、2番目の説明文字列には、より詳細な説明を含めることができる。
なお、条件式が必要ない場合については、条件式抜きで必ず停止させるFailメソッドを参照してほしい。
業務アプリInsider 記事ランキング
本日
月間