連載

改訂版
プロフェッショナルVB.NETプログラミング

Chapter 03 ステートメントの変化

株式会社ピーデー 川俣 晶
2004/03/17


 本記事は、(株)技術評論社が発行する書籍『VB6プログラマーのための入門 Visual Basic .NET 独習講座』の一部分を許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。

 Debug.Assertメソッドの移行

 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メソッドを参照してほしい。


 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Chapter 03 ステートメントの変化
    1.WendをEnd Whileに書き換える/プロシージャ脱出とReturnステートメント/関数の戻り値とReturnステートメント
    2.読み取り専用変数/複合代入ステートメント/ Staticの付いたプロシージャ/ランダム・ファイルとVBFixedString属性
    3.ステートメントを用いたテキスト・ファイルの入出力/ファイルシステム・オブジェクトを用いたテキスト・ファイルの入出力
    4.参照を使ったファイルシステム・オブジェクトの利用/ .NET Frameworkクラス・ライブラリを用いたテキスト・ファイルの入出力
    5.エンコーディング名を指定したテキスト・ファイルの入出力/シフトJISとUTF-8の相違
    6.UTF-8によるファイル出力時の文字列サイズの変化/テキスト・ファイルの書き込み位置/さまざまなファイル入出力手段の中でどれを選ぶべきか
  7.Debug.Assertメソッドの移行
    8.TraceクラスとDebugクラスの相違/条件式抜きで必ず停止させるFailメソッド/マルチスレッドを同期するSyncLockステートメント/古い制御構造 On…GoToとOn…GoSub
 
「改訂版 プロフェッショナルVB.NETプログラミング 」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH