連載

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

Chapter 13 オプション機能

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

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

遅延バインディング

 遅延バインディングとは、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のように明示的に指定すると、意図しない誤ったデータの扱いがあれば、ビルド時にコンパイラが教えてくれるからである。コンパイラが教えてくれれば、バグ取りに要する時間や手間は軽減されるだろう。


 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