連載
プロフェッショナルVB.NETプログラミング
第27回 言語の動作を選択するオプション(後編)
(株)ピーデー
川俣 晶
2002/11/30
|
|
■宣言でのAs句の省略
Dim文やメソッドの引数などでは、Asキーワードを使って型を指定する。この型指定は省略可能であり、省略するとVB 6ならVariant型、VB.NETならObject型と見なされる。以下は、そのような機能を利用した例である。
1: Public Class Form1
2: Inherits System.Windows.Forms.Form
3:
4: …Windows フォーム デザイナで生成されたコード…
5:
6: Private Sub Sample(ByVal a)
7: Dim b
8: b = 2
9: Trace.WriteLine(a + b)
10: End Sub
11:
12: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
13: Sample(1)
14: End Sub
15: End Class
|
|
Asキーワードにより型指定を省略して変数宣言しているサンプル・プログラム12 |
見てのとおり、6行目や、7行目で、Asキーワードを使わない変数や引数を宣言している。このソースの先頭にOption Strict Onを書き込むと、以下のようなビルド・エラーが発生するようになる。
Q:\aWrite\@it\vbn\022\smpl\Sample008n2\Form1.vb(47) : error BC30209: Option Strict On では、すべての変数宣言に 'As' 句が必要です。 Q:\aWrite\@it\vbn\022\smpl\Sample008n2\Form1.vb(48) : error BC30209: Option Strict On では、すべての変数宣言に 'As' 句が必要です。 Q:\aWrite\@it\vbn\022\smpl\Sample008n2\Form1.vb(50) : error BC30038: Option Strict On では、演算子 '+' に対して Object 型のオペランドを使用することはできません。 Q:\aWrite\@it\vbn\022\smpl\Sample008n2\Form1.vb(50) : error BC30038: Option Strict On では、演算子 '+' に対して Object 型のオペランドを使用することはできません。 |
|
サンプル・プログラム12の先頭に、Option Strict Onを書き込んだ場合に発生するビルド・エラー |
エラーが起きる原因は、Option Strict OnのときにはAs句を省略できないという制約による。そこで、変数や引数にAs Integerのような記述を補ってやると正常にビルド可能になる。
1: Option Strict On
2:
3: Public Class Form1
4: Inherits System.Windows.Forms.Form
5:
6: …Windows フォーム デザイナで生成されたコード…
7:
8: Private Sub Sample(ByVal a As Integer)
9: Dim b As Integer
10: b = 2
11: Trace.WriteLine(a + b)
12: End Sub
13:
14: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
15: Sample(1)
16: End Sub
17: End Class
|
|
サンプル・プログラム12を、As句により型指定するように書き換えたサンプル・プログラム13 |
このソースは問題なくビルドでき、実行できる。As句を補うときに、As Objectを無条件で補えば、データ型の違いを意識せずに対応できるが、これはお勧めしない。本当に必要とされているデータ型をAs Integerのように明示的に指定すると、意図しない誤ったデータの扱いがあれば、ビルド時にコンパイラが教えてくれる。コンパイラが教えてくれれば、バグ取りに要する時間や手間は軽減されるだろう。
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
|
|
Option Compare Binaryの状態(デフォルト)で文字列を比較するサンプル・プログラム14 |
これを実行すると以下のようになる。
これは、「『"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
|
|
サンプル・プログラム14にOption Compare Textを指定したサンプル・プログラム15 |
これを実行すると以下のようになる。
これは、「『"B" > "a"』は真である」、つまり、「"B"は"a"より大きい」ことを示している。確かに、辞書などでは、通常、大文字のBで始まる単語は、小文字のaで始まる単語より後に配置するので、正しく判断されていることが分かる。
ここで注意すべきことは、普通に使われる文字順(Option Compare Text)は、システムのロケール(言語や国に固有の情報)の指定の影響を受けるということである。つまり、日本のロケールで動いている場合と、中国や韓国のロケールで動いているときに、異なる基準で比較判断される可能性があるということである。そのため、Option Compare Textを使用するときには、使用される可能性のあるどのロケールでも適切に動作するように慎重にプログラムを作成しなければならない。
Insider.NET 記事ランキング
本日
月間