連載

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

Chapter 13 オプション機能

株式会社ピーデー 川俣 晶
2004/08/19
Page1 Page2 Page3 Page4

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

Option Compare

 Option Compare文は、文字列の比較方法を指定する。指定できる値は「Text」と「Binary」で、プロジェクト作成時のデフォルトはBinaryである。この2つは、それぞれ、Textが普通に使われる文字順、Binaryが文字コード番号順という役割を持つ。

 まず、Option Compare文を指定しない場合、つまりデフォルトのOption Compare Binaryの状態で、以下のサンプル・プログラムを試してみよう。

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("B" > "a")
8:   End Sub
9: End Class
リスト13-28 Option Compare Binaryの状態(デフォルト)で文字列を比較するプログラム

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

1: False
リスト13-29 リスト13-28の実行結果

 これは「"B" > "a" は偽である」つまり「"B" は "a" 以下である」ことを示している。文字コードで見れば、大文字のBは66で小文字のaは97であるから、文字コード順ではそのとおりである。

 では、このソースの先頭に、“Option Compare Text”と書き込んで、普通に使われる文字順に切り替えるとどうなるだろうか?

 1: Option Compare Text
 2:
 3: Public Class Form1
 4:   Inherits System.Windows.Forms.Form
 5:
 6: …Windows フォームデザイナで生成されたコード…
 7:
 8:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 9:     Trace.WriteLine("B" > "a")
10:   End Sub
11: End Class
リスト13-30 リスト13-28にOption Compare Textを指定したプログラム

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

1: True
リスト13-31 リスト13-30の実行結果

 これは、「"B" > "a" は真である」、つまり「"B" は "a" より大きい」ことを示している。辞書などでは、通常、大文字のBで始まる単語は、小文字のaで始まる単語よりあとに配置するので、確かに正しく判断されていることが分かる。

 ここで注意すべきことは、普通に使われる文字順(Option Compare Text)は、システムのロケール(言語や国に固有の情報)の指定の影響を受けるということである。つまり、日本のロケールで動いている場合と、中国や韓国のロケールで動いているときに、異なる基準で比較判断される可能性があるということである。そのため、Option Compare Textを使用するときには、使用される可能性のあるどのロケールでも適切に動作するように慎重にプログラムを作成しなければならない

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

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

 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
リスト13-32 整数の最大値に1を加算するプログラム

 これを実行すると以下のようなウィンドウが表示される(図13-33)。

●図13-33 リスト13-32を実行すると発生するオーバーフロー例外

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

 ではここで、プロジェクトのプロパティより、整数型のオーバーフローのチェックを解除してしまおう。そのあとでビルドして実行させると、例外は起こらず、出力ウィンドウに以下の結果が表示される。

1: -32768
リスト13-34 整数型のオーバーフローのチェックを解除した場合のリスト13-32の実行結果

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

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

 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
リスト13-35 整数型のオーバーフロー・チェックの有無で実行速度を比較するプログラム

 このソースを、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 Offを前提にして説明を行っている。

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

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

『VB6プログラマーのための入門 Visual Basic .NET 独習講座』

 本記事は、(株)技術評論社が発行する書籍『VB6 プログラマーのための 入門 Visual Basic .NET 独習講座』から許可を得て転載したものです。

【本連載と書籍の関係について 】
 この書籍は、本フォーラムで連載した「連載 プロフェッショナルVB.NETプログラミング」を大幅に加筆修正し、発行されたものです。技術評論社、および著者である川俣晶氏のご好意により、書籍の内容を本フォーラムの連載記事として掲載させていただけることになりました。

技術評論社の解説ページ

ご注文はこちらから
 
 

 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Chapter 13 オプション機能
    1.オプション機能による動作の変化/プロジェクトのプロパティによるオプション機能の設定/オプション機能の適用範囲
    2.Option Explicit/Option Strict(明示的なキャスト演算子を使用しない縮小変換)
    3.Option Strict(遅延バインディング/Object型での=、<>、TypeOf〜Is〜、およびIs以外の演算/宣言でのAs句の省略)
  4.Option Compare/整数のオーバーフロー・チェック/これらのオプションをどう選択するか
 
「改訂版 プロフェッショナル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