連載

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

第9回 オブジェクト関連(前編)

(株)ピーデー
川俣 晶
2002/06/15

Page1 Page2 Page3

プロパティ構文の大変更

 VB 6からVB.NETで変化したものは多いが、プロパティの構文は、特に大きな変更があったポイントの1つといえるだろう。事前の知識がなければ、どう書き換えればよいのか、予測もつかないはずだ。それぐらい劇的に変化している。では、最初に、VB 6でプロパティを記述した例を以下に示そう。まず、2つのプロパティを持つクラスのコードからお見せしよう。

  1: Private str As String
  2: Private obj As Object
  3:
  4: Public Property Get test1() As String
  5:   test1 = "Hello World!"
  6: End Property
  7:
  8: Public Property Let test1(s As String)
  9:   str = s
 10: End Property
 11:
 12: Public Property Get test2() As Object
 13:   Set test2 = obj
 14: End Property
 15:
 16: Public Property Set test2(o As Object)
 17:   Set obj = o
 18: End Property
2つのプロパティを持つクラスを定義したVB 6のサンプル・プログラム16

 これを呼び出すコードとして以下のようなコードを記述してみた。

 1: Private Sub Form_Load()
 2:   Dim obj As New Class1
 3:
 4:   obj.test1 = "Hello!"
 5:   Debug.Print obj.test1
 6:
 7:   Set obj.test2 = Form1
 8:   Debug.Print obj.test2.Caption
 9: End Sub
サンプル・プログラム16を呼び出すVB 6のサンプル・プログラム17

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

 1: Hello World!
 2: Form1
サンプル・プログラム17の実行結果

 では、これとほぼ同等の機能をVB.NETで記述してみた例を以下に示す。まずは、プロパティを持つクラスのソースから。

  1: Public Class Class1
  2:   Private str As String
  3:   Private obj As Object
  4:
  5:   Public Property test1() As String
  6:     Get
  7:       Return str
  8:     End Get
  9:     Set(ByVal Value As String)
 10:       str = Value
 11:     End Set
 12:   End Property
 13:
 14:   Public Property test2() As Object
 15:     Get
 16:       Return obj
 17:     End Get
 18:     Set(ByVal Value As Object)
 19:       obj = Value
 20:     End Set
 21:   End Property
 22: End Class
サンプル・プログラム16とほぼ同等の機能を持つVB.NETのサンプル・プログラム18

 見ての通り激変である。まず、Property Set、Property Let、Property Getの3つの構文は姿を消した。その代わり、5行目や14行目のようなProperty宣言を用いて、プロパティの宣言を行う。そして、Property宣言の内部に、“Get〜End Get”と“Set〜End Set”を書き込んで、その中に実際にSetやGetの処理を書き込む。ここで注意すべきことは、VB 6では、Set、Let、Getと3つの種類の操作があったのに、VB.NETには、SetとGetしか存在しないことである。これは、VB.NETではLetとSetの区別がなくなったことにより、プロパティでも、LetとSetの区別が不要になったことによる変化である。

 実際にプロパティの動作を記述する方法も変化している。まず、7行目や16行目のReturnは、プロパティの値を設定する機能を持っている。Returnを使うのは、メソッドの戻り値を指定するためのVB.NETの新しい構文と共通のものである。これについては、本連載でいずれ取り上げる。なお、従来どおり、プロパティ名への代入で行うこともできる。

 これを呼び出すコードは以下のようになる。

 1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 2:   Dim obj As New Class1()
 3:
 4:   obj.test1 = "Hello!"
 5:   Trace.WriteLine(obj.test1)
 6:
 7:   obj.test2 = sender
 8:   Trace.WriteLine(obj.test2.Text)
 9: End Sub
サンプル・プログラム18を呼び出すVB.NETのサンプル・プログラム19

 ほとんど同じだが、Setキーワードが不要になり、SetとLetの区別が不要になったことが、このソースからも読みとれるだろう。なお、7行目だけ別のコードに書き変わっているが、VB 6のForm1はフォームのインスタンスの名前であるのに対して、VB.NETではForm1はクラス名であることにより、Form1を代入することはできない。このイベントが発生したフォームのインスタンスへの参照は、Loadイベントの引数のsenderに含まれているので、これを使えば等価の結果となる。さらにに、8行目のTextプロパティは、VB 6のCaptionプロパティの名前が変わったものである。

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

 1: Hello!
 2: Form1
サンプル・プログラム19の実行結果

 結果は同じだが、構文は大きく変わったので、注意しよう。

次回予告

 次回は継承などの機能を取り上げたいと考えている。End of Article


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第9回 オブジェクト関連(前編)
    1.オブジェクト関連のタイミングの違い
    2.コンストラクタへの引数
  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 記事ランキング

本日 月間