連載

プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――

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

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

Page1 Page2 Page3

 前回に引き続き、VB.NET(Visual Basic .NET)で指定可能な「オプション」について解説する。前回では、オプションの1つである「Option Strict」をOnにした場合にビルド・エラーとなる以下の項目のうち、最初の項目であるキャストを使用しない縮小変換について解説した。今回はまず残る3つの項目から見ていこう。

  • 明示的なキャスト演算子を使用しない縮小変換
  • 遅延バインディング
  • Object 型での=、<>、TypeOf〜Is〜、およびIs以外の演算
  • 宣言でのAs句の省略

■遅延バインディング

 遅延バインディングとは、VB 6(Visual Basic 6.0)でデータ型を明示しないプログラミングを行うときに必須だった機能である。VB 6ならVariant型、VB.NETならObject型の変数に何でも入れて、そこに入ったオブジェクトのメソッドなどを呼び出すために使われる。この機能を使って、例えば、以下のようなソースを記述することができる。

  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
遅延バインディングによりObject型の変数経由でメソッドを呼び出すサンプル・プログラム8

 このソースで、8行目はObject型の変数にフォームのインスタンスを代入している。そして、9行目では、フォームのTextプロパティを参照している。変数aはObject型なので、IDEの中でキーボードから「a.」と入力しても、フォームのメソッドやプロパティのリストは表示されない。つまり、この時点で、IDEはTextというプロパティが利用可能であることを認識していない。しかし、実行時に変数aの中身がチェックされ、Textというプロパティが存在することが認識されて、プロパティの値が表示される。

 ただし、先頭行にOption Strict Onを書き込むと以下のようなビルド・エラーが発生するようになる。

 1: Q:\aWrite\@it\vbn\022\smpl\Sample006n2\Form1.vb(50) : error BC30574: Option Strict On では、遅延バインディングを使用できません。
サンプル・プログラム8の先頭にOption Strict Onを書き込んだ場合に発生するビルド・エラー(エラーとなっている50行目は、上記のサンプル・プログラム8では9行目)

 これを実行可能にするには、遅延バインディングというテクニックそのものをやめるしかない。このソースなら、7行目のデータ型をObjectからFormに変えるのが最も手っ取り早い。データ型を変えられない都合がある場合は、以下のような書き方もできる。

  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
サンプル・プログラム8を、DirectCast関数を使用してキャストを行うように書き換えたサンプル・プログラム9

 ここでは、9行目ですでに説明したDirectCast関数を使用して、明示的なデータ型の変換(キャスト)を行っている。もちろん、キャストは変換できない場合にエラーを発生させることに注意が必要である。どちらかといえば、お勧めではない書き方である。

■Object型での=、<>、TypeOf〜Is〜、およびIs以外の演算

 VB 6ではVariant型、VB.NETではObject型の変数に数値を入れて足し算や引き算を行うことは容易に実現できた。以下のその例を示す。

  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
Object型の変数に数値を代入して演算を行うサンプル・プログラム10

 しかし、先頭行に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 型のオペランドを使用することはできません。
サンプル・プログラム10の先頭に、Option Strict Onを書き込んだ場合に発生するビルド・エラー

 Option Strict Onのときには、Object型に対して、=や、<>、TypeOf〜Is〜、Is以外の演算を行うことができない。そのため、10行目の足し算は実現できない。しかし、11行目のTypeOf〜Is〜演算子は禁止されていないので、エラーになっていない。これをビルド可能にするには、小まめに変数のデータ型を指定するしかない。

 例えば、以下のように書き換えることができる。

  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
サンプル・プログラム10を、変数のデータ型を指定するように書き換えたサンプル・プログラム11

 変数a、bをInteger型に変更すれば、問題なくビルドできる。ここでは、変数cだけObject型で残してある点に注意して欲しい。単に整数を入れるだけの変数であれば、Object型でもエラーにならない。代入の=は利用可能な演算子のリストに含まれているのである。


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

本日 月間