アップグレードに関する推奨事項 : パラメータのない既定プロパティの解決
更新 : 2007 年 11 月
Visual Basic 6.0 では、多くのオブジェクトで既定のプロパティが公開されており、指定を省略してプログラミングを簡略化できます。たとえば、TextBox の既定プロパティは Text であるため、
MsgBox Form1.Text1.Text
の代わりに、次のように省略して記述できます。
MsgBox Form1.Text1
既定のプロパティは、コードのコンパイル時に解決されます。また、次の例のように、遅延バインディング オブジェクトで既定のプロパティを使用することもできます。
Dim obj As Object
Set obj = Form1.Text1
MsgBox obj
遅延バインディングの例では、既定のプロパティが実行時に解決され、MsgBox は TextBox の既定プロパティの値を Text1 として表示します。
Visual Basic 2008 では、パラメータのない既定プロパティはサポートされていないため、このようなプログラムの簡略化はできません。プロジェクトをアップグレードすると、Visual Basic 2008 はパラメータのない既定プロパティを解決しますが、実行時に解決される遅延バインディングは自動的に解決できません。そのような場合は、アップグレード後にコードを変更する必要があります。さらに複雑なことに、多くのライブラリは既定のプロパティを実装するために _Default. _Default というプロパティを使用しています。このプロパティは、プロキシとして動作し、呼び出しを本当の既定のプロパティに渡します。したがって、プロジェクトをアップグレードすると、いくつかの既定プロパティが _Default に解決されます。コードは通常どおりに動作しますが、実際のプロパティを使用して明示的に記述されたコードに比べると、理解しにくくなります。以上の理由により、Visual Basic 6.0 のコードでパラメータのない既定プロパティを使用することは避けるようにします。次のようなコードは記述しないでください。
Dim obj As Object
Set obj = Me.Text1
'BAD: Relying on default property
MsgBox obj
'BAD: Relying on default property
MsgBox Me.Text1
代わりに、次のコードを使用します。
Dim obj As TextBox
Set obj = Me.Text1
'GOOD: Default property is resolved
MsgBox obj.Text
'GOOD: Default property is resolved
MsgBox Me.Text1.Text
Visual Basic 2008 では、パラメータのない既定プロパティはサポートされませんが、パラメータを持つ既定プロパティはサポートされています。この 2 種類の違いを理解するために、パラメータを持つ既定プロパティには常にインデックスが存在すると考えてください。たとえば、ADO recordset の既定プロパティは Fields コレクションです。コード例は、次のとおりです。
Dim rs As ADODB.Recordset
rs("CompanyName") = "SomeCompany"
rs!CompanyName = "SomeCompany"
これは、実際には次のコードを簡略化したものです。
Dim rs As ADODB.Recordset
rs.Fields("CompanyName").Value = "SomeCompany"
rs.Fields!CompanyName.Value = "SomeCompany"
この場合、Fields プロパティはパラメータを持つため、Visual Basic 2008 では有効な使用例です。ただし、Fields プロパティの既定プロパティである Value はパラメータを持たないため、Visual Basic 2008 での正しい使用例は次のようになります。
Dim rs As ADODB.Recordset
rs("CompanyName").Value = "SomeCompany"
rs!CompanyName.Value = "SomeCompany"
この例に示すプロパティやその他の既定プロパティは、プロジェクトのアップグレード時に解決されます。したがって、Visual Basic 6.0 でそれを解決することは、良いプログラミング手法です。ただし、Object および Variant データ型に対して既定のプロパティを使用することは避けてください。これらのデータ型の既定プロパティは解決できず、プロジェクトをアップグレードした後でコードを修正する必要があります。