連載

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

第27回 言語の動作を選択するオプション(後編)

(株)ピーデー
川俣 晶
2002/11/30

Page1 Page2 Page3

整数のオーバーフロー・チェック

 整数型は表現できる数値の範囲が決まっていて、それを1でも超えると扱えなくなる。そういう場合に、オーバーフロー・エラーを起こすのがVB 6であった。VB.NETでも、プロジェクトのデフォルト状態では同じようにエラーが起こる。それを確かめるために、以下のようなソースを作成してみた。

  1: Public Class Form1
  2:   Inherits System.Windows.Forms.Form
  3:
  4: …Windows フォーム デザイナで生成されたコード…
  5:
  6:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  7:     Dim a As Short
  8:     a = 32767
  9:     a = a + 1
 10:     Trace.WriteLine(a)
 11:   End Sub
 12: End Class
整数の最大値に1を加算するサンプル・プログラム16

 これを実行すると以下のようになる。

サンプル・プログラム16を実行すると発生するオーバーフロー例外

 Short型が表現できる最大値は32767なので、それに1を足すと、オーバーフローの例外が発生する。

 ではここで、前回で示したプロジェクトのプロパティより、整数型のオーバーフローのチェックを解除してしまおう。

 その後でビルドして実行させると、例外は起こらず、出力ウィンドウに以下の結果が表示される。

 1: -32768
整数型のオーバーフローのチェックを解除した場合のサンプル・プログラム16の実行結果

 このように、オーバーフローしても関係なくそのままプログラムは実行を続け、計算結果も本来意図した値とはまったく無関係の値となる。その点で、整数型のオーバーフローのチェックは解除しない方が安全といえるだろう。間違った数字を結果として出すよりは、エラーで止まった方が被害が少ないからだ。

 だが、被害の多い方法がどうしてサポートされたのだろうか。恐らく、速度というメリットを取ったものではないかと思う。速度差を見るために、以下のようなソースを書いてみた。

  1: Public Class Form1
  2:   Inherits System.Windows.Forms.Form
  3:
  4: …Windows フォーム デザイナで生成されたコード…
  5:
  6:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  7:     Trace.WriteLine(Date.Now)
  8:     Dim a As Long
  9:     a = 0
 10:     Dim i As Long
 11:     For i = 0 To 1000000000
 12:       a = a + 1
 13:       a = a + 1
 14:       a = a + 1
 15:       a = a + 1
 16:       a = a + 1
 17:       a = a + 1
 18:       a = a + 1
 19:       a = a + 1
 20:       a = a + 1
 21:       a = a + 1
 22:     Next
 23:     Dim done As DateTime = DateTime.Now
 24:     Trace.WriteLine(Date.Now)
 25:     Trace.WriteLine(a)
 26:   End Sub
 27: End Class
整数型のオーバーフロー・チェックの有無で実行速度を比較するためのサンプル・プログラム17

 このソースを、Pentium 4/1.5GHzのPCで実行してみた所(デバッグ・ビルド)、整数のオーバーフロー・チェックありの場合は約127秒、なしの場合は約96秒という結果が得られた。確かに、速度重視の場合、整数のオーバーフロー・チェックを解除する意義があるかもしれない。

これらのオプションをどう選択するか

 ここまで見てきたように、VBプログラマーは、これまでにない多くのオプションを手に入れた。では、これらのオプションをどう選べばよいのだろうか?

 この判断には、個人的な価値観が付きまとうので、なかなか結論を出すことは難しい。オプション選択が存在するということは、裏を返せば、人によって理想が異なることを意味しているとすらいえる。

 そこで、あくまで筆者の個人的な意見として、推奨の選択肢を以下に述べる。

 まず最悪の選択は、デフォルト設定からOption ExplicitをOffにしてしまうことである。一見、変数の宣言を書かなくてよい分だけ楽ができそうだが、実際には宣言をさぼるとバグが入り込む可能性が出てくる。一度バグが出てそれを取るために苦労すれば、あっという間に、楽した分より多くの時間を費やされることになる。それゆえに、実は、変数宣言は必ず行うようにした方が、結果として楽なのである。単に変数宣言を追加するだけなので、実践も容易である。ぜひとも、Option ExplicitはOffにしないようにして使おう。

 では、Option StrictをOnに変更するという選択はどうだろうか? これは可能ならぜひ行うべきものだろう。これによってプログラムから曖昧なデータ型変換がだいぶ減るので、バグも減ることが期待できる。バグが減れば、トータルで必要とする作業時間も減るので、楽になる。しかし、Option Explicit Onは単に変数の宣言を追加するだけで対応可能だが、Option Strict Onはいろいろと従来のコーディング・テクニックが使えないケースが出てくるので、なかなか容易にOnにできないかもしれない。逆に、容易にOption Strict Onのプログラミングに対応できるぐらいなら、C#などほかのもっと新しい言語に乗り換えるのも容易だろう。Option Strict OnのVB.NETとC#のどちらも使えるなら、筆者としてはC#を使うことを勧める。しかし、多くのVB.NETプログラマーにとっては、Option Strict Onに対応することが困難であろうと考えて、この連載では、Option Strict Onを前提にして説明を行っていない。

 Option Compareについてはどうだろうか。これは、文字列比較の性質の違いなので、どちらが優れているともいい切れない。目的によって選択すべきものだろう。

 最後に、整数型のオーバーフロー・チェックだが、これを解除するのは、十分にテスト済みでオーバーフローなど起きないと確信を持てるプログラムの場合に限るとよいだろう。ただし、オーバーフローの例外を、例外処理によりCatch文で捕まえて何かの機能に活用している可能性もある。そのようなプログラムでは、チェックを解除することがプログラムの正常な動作を阻害する可能性がある。解除する前に事前の確認が必要だろう。

次回予告

 次回はVB 6にはなかったVB.NETの新しい機能である「属性」に関する解説を予定している。End of Article


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第27回 言語の動作を選択するオプション(後編)
    1.遅延バインディング
    2.宣言でのAs句の省略
  3.整数のオーバーフロー・チェック

更新履歴
【2002/12/02】 本ページ内の「これらのオプションをどう選択するか」の第5パラグラフにおいて、「Option Strict On」が「Option Explicit On」となっている個所がありました。お詫びして訂正させていただきます。

「プロフェッショナル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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間