連載

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

第12回 既定のプロパティとメソッド利用となる関数

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

Page1 Page2

既定のプロパティ

 第10回でも解説したように、VB 6(Visual Basic 6.0)では、既定のプロパティ(デフォルト・プロパティ)を指定することができる。例えば、テキスト・ボックスの編集文字列を指定するために、

TextBox1.Text = "Hello!"

とする代わりに、

TextBox1 = "Hello!"

と記述してもよい。これは、テキスト・ボックスのデフォルト・プロパティとしてTextが指定されているためである。しかし、この機能は、VB.NET(Visual Basic .NET)ではサポートされていない。サポートされない理由はいくつもあるが、ソースが曖昧で分かりにくくなるという理由が大きいだろう。オブジェクト変数そのものに代入しようとしている構文が、オブジェクト変数の書き換えを意図するのか、それとも、オブジェクトのデフォルト・プロパティにアクセスしようとしているのか、コードから瞬間的に明確に読みとれない場合があるからだ。さらにVB.NETでは、値の代入と参照の代入の構文の区別がなく、両者を明瞭に区別する手段が存在しないことになり、既定のプロパティという機能を付け加えることは不可能に近い状況になっている。

 しかし、この件には例外が1つある。引数を持つプロパティに関しては、既定のプロパティを宣言することができる。考えてみれば明らかなことだが、引数を持ったプロパティへの代入と、オブジェクト変数への代入は、ソース・コードの文字の並びが明らかに異なっており、コンパイラもプログラマーも間違える危険は低い。前者は“a = b”という構文だが、後者は“a(b) = c”というような構文になるからだ。VB.NETは、このような引数付きのプロパティに関しては、デフォルト・プロパティを指定することができる。

 以下は、実際にデフォルト・プロパティを記述してみたクラスの例である。

  1: Public Class Class1
  2:   Private str(9) As String
  3:
  4:   Default Public Property test1(ByVal index As Integer) As String
  5:     Get
  6:       Return str(index)
  7:     End Get
  8:     Set(ByVal Value As String)
  9:       str(index) = Value
 10:     End Set
 11:   End Property
 12: End Class
デフォルト・プロパティを記述したVB.NETのサンプル・プログラム1

 ここでポイントになるのは、4行目に記述されたDefaultキーワードである。このキーワードが付加されたことにより、4行目で宣言されるtest1プロパティはデフォルト・プロパティになる。もちろん、ここにDefaultキーワードが記述できるのは、このプロパティがindexという引数を持っているためである。

 このクラスを呼び出すコードは以下のように書ける。

  1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2:   Dim a As New Class1()
  3:   Dim i As Integer
  4:   For i = 0 To 4
  5:     a(i) = i.ToString()
  6:   Next
  7:   For i = 5 To 9
  8:     a.test1(i) = i.ToString()
  9:   Next
 10:   For i = 0 To 4
 11:     Trace.WriteLine(a.test1(i))
 12:   Next
 13:   For i = 5 To 9
 14:     Trace.WriteLine(a(i))
 15:   Next
 16: End Sub
サンプル・プログラム1を利用するVB.NETのサンプル・プログラム2

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

  1: 0
  2: 1
  3: 2
  4: 3
  5: 4
  6: 5
  7: 6
  8: 7
  9: 8
 10: 9
サンプル・プログラム2の実行結果

 見ての通り、このソースの4〜6行目では、デフォルト・プロパティの機能を使って値を代入している。整数(Integer)のToString()は、数値を文字列に変換するメソッドである。そして、コードの7〜9行目は、デフォルト機能は使わずプロパティ名を明示して値を代入している。10〜12行目は、代入した値を取り出して出力しているが、デフォルト・プロパティとして代入したものを、名前を明示したプロパティとして取り出している。同様に、13〜15行目は、名前を明示したプロパティとして代入されたものを、デフォルト・プロパティとして取り出している。結果を見て分かるとおり、デフォルト・プロパティと名前を明示したプロパティは完全に等価として機能しており、どちらで代入した値であろうと、どちらの方法でも読み出せる。

デフォルト・プロパティの実例

 デフォルト・プロパティが実際に利用可能な例を見てみよう。ここでは、フォームのLoadイベント内で、フォーム上にあるコントロールの表示位置を一覧表示するものを考えてみる。これは以下のようなコードで実現できる。

 1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 2:   Dim i As Integer
 3:   For i = 0 To Me.Controls.Count() - 1
 4:     Trace.Write(Me.Controls(i).Left)
 5:     Trace.Write(", ")
 6:     Trace.WriteLine(Me.Controls.Item(i).Top)
 7:   Next
 8: End Sub
フォーム上のコントロール表示位置を一覧表示するVB.NETのサンプル・プログラム3

 以下のような内容がフォームに貼り付けられているときの実行結果を示す。

サンプル・プログラム3実行時のフォーム上のコントロール
 
 1: 8, 96
 2: 8, 64
 3: 8, 32
 4: 8, 8
サンプル・プログラム3の実行結果

 さて、ソース・コードは分かりにくいと思うので詳しく説明しよう。

 まず、3行目から見ていこう。Meは処理中のフォーム自身のインスタンスを持っている。つまり、System.Windows.Forms.Formクラスのインスタンスを持っている。System.Windows.Forms.Formクラスは、Controlsというプロパティを持っている。このプロパティのデータ型は、System.Windows.Forms.Control.ControlCollectionクラスである。このクラスの役割は、フォーム上のコントロールの一覧表(コレクション)を提供することにある。このクラスには、コントロール数を返すCount()というメソッドがある。3行目では、このメソッドを用いて、繰り返す回数を決定している。

 コードとは順番が前後するが、先に6行目を見てみよう。System.Windows.Forms.Control.ControlCollectionクラスには、データ型としてSystem.Windows.Forms.Controlクラスを持つ、itemというプロパティがある。これは引数で指定した順番のコントロールにアクセスするものである。コントロールの左の座標はこのクラスのLeftプロパティで参照でき、上の座標はこのクラスのTopプロパティで参照できる。

 さて、ここからが本題である。Itemプロパティはデフォルト指定がなされているため、プロパティ名を省略することができる。ソース・コード4行目を見ていただきたい。記述している内容は、6行目とほぼ同じであるが、プロパティ名が省略されていることが分かると思う。

 このようなデフォルト・プロパティの指定は、クラス・ライブラリでしばしば見かけるものであり、自分からデフォルト・プロパティを記述する意思がないプログラマーでも、知識として知っておく価値がある。

 なお、厳密な意味では同じとはいえないが、C#言語におけるインデクサと似たような効能を持つ機能ということができる(C#のインデクサについては「C#入門:第12回 インデクサとプロパティ」で解説している)。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第12回 既定のプロパティとメソッド利用となる関数
  1.既定のプロパティ
    2.クラス・ライブラリ利用に変わるいくつかの関数
 
「プロフェッショナル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 記事ランキング

本日 月間