|
|
連載
改訂版
プロフェッショナルVB.NETプログラミング
Chapter 13 オプション機能
株式会社ピーデー
川俣 晶
2004/08/19 |
|
|
遅延バインディング
遅延バインディングとは、VB 6でデータ型を明示しないプログラミングを行うときに必須だった機能である。VB 6ならVariant型、VB.NETならObject型の変数に何でも入れて、そこに入ったオブジェクトのメソッドなどを呼び出すために使われる。この機能を使って、例えば、リスト13-19のようなソースを記述することができる。
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 Object
8: a = Me
9: Trace.WriteLine(a.Text)
10: End Sub
11: End Class
|
|
リスト13-19 遅延バインディングによりObject型の変数経由でメソッドを呼び出すプログラム
|
このソースで、8行目はObject型の変数にフォームのインスタンスを代入している。そして、9行目ではフォームのTextプロパティを参照している。変数aはObject型なので、IDEの中でキーボードから「a.」と入力しても、フォームのメソッドやプロパティのリストは表示されない。つまり、この時点で、IDEはTextというプロパティが利用可能であることを認識していない。しかし、実行時に変数aの中身がチェックされ、Textというプロパティが存在することが認識されるため、プロパティの値が表示される。
しかし、先頭行にOption Strict Onを書き込むと以下のようなビルド・エラーが発生するようになる。なお、エラーとなっている50行目は、リスト13-19では9行目に相当する。
1: Q:\aWrite\@it\vbn\022\smpl\Sample006n2\Form1.vb(50) : error BC30574: Option Strict On では、遅延バインディングを使用できません。
|
|
リスト13-20 リスト13-19の先頭にOption Strict Onを書き込んだ場合に発生するビルド・エラー
|
これを実行できるようにするには、遅延バインディングというテクニックそのものをやめるしかない。このソースなら、7行目のデータ型をObjectからFormに変えるのが最も手っ取り早い。データ型を変えられない都合がある場合は、リスト13-21のような書き方もできる。
1: Option Strict On
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: Dim a As Object
10: a = Me
11: Trace.WriteLine(DirectCast(a, Form).Text)
12: End Sub
13: End Class
|
|
リスト13-21 リスト13-19を、DirectCast関数を使用してキャストを行うように書き換えたプログラム
|
ここでは、9行目ですでに説明したDirectCast関数を使用して、明示的なデータ型の変換(キャスト)を行っている。もちろん、キャストは変換できない場合にエラーを発生させることに注意が必要である。どちらかといえば、お勧めではない書き方である。
Object型での=、<>、TypeOf〜Is〜、およびIs以外の演算
VB 6ではVariant型、VB.NETではObject型の変数に数値を入れて足し算や引き算を行うことは容易に実現できた。リスト13-22にその例を示す。
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 Object, b As Object, c As Object
8: a = 1
9: b = 2
10: c = a + b
11: Trace.WriteLine(TypeOf c Is Integer)
12: Trace.WriteLine(c)
13: End Sub
14: End Class
|
|
リスト13-22 Object型の変数に数値を代入して演算を行うプログラム
|
しかし、先頭行にOption Strict Onを書き込むと、以下のようなビルド・エラーが発生するようになる。
1: Q:\aWrite\@it\vbn\022\smpl\Sample007n2\Form1.vb(51) : error BC30038: Option Strict On では、演算子 '+' に対して Object 型のオペランドを使用することはできません。
2: Q:\aWrite\@it\vbn\022\smpl\Sample007n2\Form1.vb(51) : error BC30038: Option Strict On では、演算子 '+' に対して Object 型のオペランドを使用することはできません。
|
|
リスト13-23 リスト13-22の先頭に、Option Strict Onを書き込んだ場合に発生するビルド・エラー
|
Option Strict Onのときには、Object型に対して、=や、<>、TypeOf〜Is〜、Is以外の演算を行うことができない。そのため、10行目の足し算は実現できない。しかし、11行目のTypeOf〜Is〜演算子は禁止されていないので、エラーになっていない。これをビルド可能にするには、小まめに変数のデータ型を指定するしかない。
例えば、リスト13-24のように書き換えることができる。
1: Option Strict On
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: Dim a As Integer, b As Integer, c As Object
10: a = 1
11: b = 2
12: c = a + b
13: Trace.WriteLine(TypeOf c Is Integer)
14: Trace.WriteLine(c)
15: End Sub
16: End Class
|
|
リスト13-24 リスト13-22を、変数のデータ型を指定するように書き換えたプログラム
|
変数a、bをInteger型に変更すれば、問題なくビルドできる。ここでは、変数cだけObject型で残してある点に注意して欲しい。単に整数を入れるだけの変数であれば、Object型でもエラーにならない。代入の=は利用可能な演算子のリストに含まれているのである。
宣言でのAs句の省略
Dim文やメソッドの引数などでは、Asキーワードを使って型を指定する。この型指定は省略可能であり、省略するとVB 6ならVariant型、VB.NETならObject型と見なされる。リスト13-25は、そのような機能を利用した例である。
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
|
|
リスト13-25 Asキーワードにより型指定を省略して変数宣言しているプログラム
|
見てのとおり、6行目や7行目で、Asキーワードを使わない変数や引数を宣言している。このソースの先頭にOption Strict Onを書き込むと、以下のようなビルド・エラーが発生するようになる。
1: Q:\aWrite\@it\vbn\022\smpl\Sample008n2\Form1.vb(47) : error BC30209: Option Strict On では、すべての変数宣言に 'As' 句が必要です。
2: Q:\aWrite\@it\vbn\022\smpl\Sample008n2\Form1.vb(48) : error BC30209: Option Strict On では、すべての変数宣言に 'As' 句が必要です。
3: Q:\aWrite\@it\vbn\022\smpl\Sample008n2\Form1.vb(50) : error BC30038: Option Strict On では、演算子 '+' に対して Object 型のオペランドを使用することはできません。
4: Q:\aWrite\@it\vbn\022\smpl\Sample008n2\Form1.vb(50) : error BC30038: Option Strict On では、演算子 '+' に対して Object 型のオペランドを使用することはできません。
|
|
リスト13-26 リスト13-25の先頭に、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
|
|
リスト13-27 リスト13-25を、As句により型指定するように書き換えたプログラム
|
このソースは問題なくビルドでき、実行できる。As句を補うときに、As Objectを無条件で補えば、データ型の違いを意識せずに対応できるが、この方法はお勧めしない。本当に必要とされているデータ型をAs Integerのように明示的に指定すると、意図しない誤ったデータの扱いがあれば、ビルド時にコンパイラが教えてくれるからである。コンパイラが教えてくれれば、バグ取りに要する時間や手間は軽減されるだろう。
業務アプリInsider 記事ランキング
本日
月間