升级建议:解析无参数默认属性
更新: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 中不支持无参数默认属性,但支持具有参数的默认属性。如果考虑到参数化的默认属性始终有索引,就会了解这两种类型之间的差异。一个示例是 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 数据类型的默认属性,因为它们无法被解析而且必须您亲自修复已升级项目中的代码。