僕は、VB6の頃は、規定のプロパティを多用していました。
当時は、規定のプロパティを用いる方法は一般的で、テキストコントロールなどは、コントロールのオブジェクトに直接文字列を渡せば、既定の Text プロパティに格納されました。
僕も当時は直感的にわかりやすいと思って、自分で作成したクラスにも規定のプロパティを設けることが多かったのです。
Dim Obj As MyClass
Set Obj = HogeHoge 'HogeHoge オブジェクトを Obj に代入する。
Obj = "あいうえお"
VB6以前は、上記のように、参照型の変数にオブジェクトを代入する場合は、Set を使う必要がありました。
この規則があるからこそ、規定のプロパティを利用できたともいえるかと思います。
.Netの場合は、以下のように Set を使いません。
[VB]
Dim Obj As MyClass
Obj = HogeHoge 'HogeHoge オブジェクトを Obj に代入する。
Obj.DefaultPropertyValue = "あいうえお"
[C#]
MyClass Obj;
Obj = HogeHoge; //HogeHoge オブジェクトを Obj に代入する。
Obj.DefaultPropertyValue = "あいうえお"
これを見ると、規定のプロパティが使えなくなってしまった理由もわかりますね。
ただし、インデックスを付加した場合に限っては、以下のようにプロパティ名を省略できます。
MyClass Obj = HogeHoge;
Obj[0] = "あいうえお"
Obj[1] = "あいうえお"
確かに、このような書き方なら、プロパティ名が明示されなくてもわかりやすいですね。
そんな訳で、MyClass を上記のような書き方に対応させるには次のようにします。
Public Class MyClass
Dim a() As String
Public Sub New(ByVal count As Integer)
a = New String(count) {}
End Sub
Default Public Property Item(ByVal index As Integer) As String
Get
Return a(index)
End Get
Set(ByVal Value As String)
a(index) = Value
End Set
End Property
End Class
C# では、
インデクサ
という機能を使います。
Class MyClass
{
private string[] a;
public MyClass(int count) {
a = new String[count];;
}
public string this[int index] {
get {
return a[index];
}
set {
a[index] = value;
}
}
}
インデクサとは言ってみたものの、ちょっと変わったプロパティに見えます。