■ デフォルトプロパティ
- デフォルトプロパティは使えない
Visual Basic 6.0 では、デフォルトプロパティを使うことができました。
たとえば、
Text2.Text = Text1.Text
というコードは、デフォルトプロパティを省略して、
Text2 = Text1
と、コーディングすることができました。Visual Basic .NET では 「デフォルトプロパティ」 は使わなくなりました (PlusOne 参照)。なお、例外については、関連・補足項目 を参照してください。
アップグレードウィザードは、デフォルトプロパティを自動解決してくれます。
Visual Basic 6.0 の、
Text2 = Text1' OKなパターン
というコードは、自動的に、
Text2.Text = Text1.Text
にしてくれます。
また、Visual Basic 6.0 の、
Dim obj As TextBox' これも OK なパターン
Set obj = Form1.Text1
MsgBox obj
というコードも、アップグレードウィザードが最後の行を、
MsgBox obj.Text
としてくれるので、変換後に何もしなくても動作します。
ただし、この 「自動解決」 をしてくれない場合もあります。それは、Visual Basic 6.0 で書かれた以下のようなコードです。
Dim obj As Object' これは×なパターン
Set obj = Form1.Text1
MsgBox obj
変数を Object 型として宣言し、実行時にクラスのインスタンスを代入するというこのパターンは、いわゆる実行時バインディングになっていて、オブジェクトが特定できません。そのためデフォルトプロパティの自動解決も行なえず、このままではエラーになってしまいます。そこで変換後、コードの手動変更が必要となります。
オブジェクト変数の実行時バインディングは避けましょう。
また、アップグレードウィザードを通さず、コピー&ペーストで Visual Basic 6.0 のコードを再利用しようと思うのであれば、デフォルトプロパティの利用も避けておくと無難です。
デフォルトプロパティ使用不可の例外
コレクションのようなパラメータ付きのデフォルトの使用は可能です。たとえば、
rs("CompanyName").Value 'OK
は、Visual Basic 6.0 でも、Visual Basic .NET でも、
rs.Fields("CompanyName").Value
の Fields コレクションを省略したものとして解釈されます。
なぜ、デフォルトプロパティがなくなったのでしょう?
たとえば、Visual Basic 6.0 では、オブジェクトの代入に Set ステートメントを利用しました。オブジェクト X と Y があったとき、
Set Y = X
は、X (オブジェクト) を Y に代入することを意味します。そして、X のプロパティを代入したいときは、
Y.プロパティ = X.プロパティ
と書くか、あるいは、このプロパティがデフォルトである場合は省略でき、
Y = X
と記述することができます。
Visual Basic .NET では、オブジェクトの代入にも変数の代入にも Set ステートメントを使う必要がなくなりました。
Y = X
と記述した際、(参照型であれば) X が参照しているオブジェクトへの参照が Y にセットされます。一方、「X のプロパティ」を「Y のプロパティ」代入したいときには、
Y.プロパティ = X.プロパティ
と明示します。これにより、プログラムが明確になり、あいまいさがなくなるという利点があります。