在 Visual Basic 应用程序中,对象的使用越来越多,因此优化对象的使用变得越来越重要。以下几种关键技术可以最有效地使用对象:
在 Visual Basic 中,在代码中(通过获取或设置对象的属性,或执行它的一个方法)引用另一个应用程序的对象将构成一个跨进程的调用。因为,跨进程调用的代价昂贵,所以,当须考虑优化应用程序时就应避免使用它们。
如果对象可事前连接,Visual Basic 使用对象就更有效。若提供了对包含对象的类型库的引用,并声明了对象的类型,那么对象就可以事前连接:
Dim X As New MyObject
或者,相当于:
Dim X As MyObject
Set X = New MyObject
事前连接可使 Visual Basic 在编译时完成大多数处理对象的定义的工作,而不是在运行时处理。这也可使 Visual Basic 检查对象所用属性和方法的语法错误,并报告错误。
若 Visual Basic 不能事前连接对象,那么就必须是事后连接。事后连接对象的代价很大:在编译时不进行错误检查,在运行时每个引用需要至少由 Visual Basic 增加 50% 的工作量。
通常,应尽可能事前连接对象。如果没有针对问题的对象的类型库,或需要将任意类型的对象作为参数传给过程,只有这时才不得不将变量声明为 As Object。
详细信息 关于事前连接的详细信息,请参阅“用部件编程”中“加速对象引用”。
当从 Visual Basic 中引用其它应用程序的对象时,可使用点语法“.”对对象的集合、对象、属性和方法进行定位。创建特别长的定位字符串并不常见。例如:
'
引用Sheet1
中单元A1
,它在Microsoft Excel
电子表格的第一部'
工作册上。Application.Workbooks.Item(1).Worksheets.Item_
("Sheet1").Cells.Item(1,1)
除了键入的字符串相当长以外,这行代码还相当难读—并且效率极其低。
当从 Visual Basic 中调用对象时,每一个“点”都需要 Visual Basic 产生多次调用。
为了写出最有效的应用程序,引用对象时尽量少使用点操作。
通过分析可用的对象和方法,常常可减少点操作的数量。例如,删除 Item 方法(对于集合,这是缺省的方法,因此在代码中很少用)并使用比较有效的 Range 方法,就可缩短上面的代码行:
'
引用Sheet1
中单元A1
,它在Microsoft Excel
电子表格的第一部'
工作册上。Application.Workbooks(1).Worksheets("Sheet1")_
.Range("A1")
重写代码,上面的代码行还可进一步缩短。引用活动工作册上的活动工作单,而不是指定工作册上的指定工作单:
'
引用活动工作册上的活动工作单中的单元A1
。Range("A1")
当然,上面的示例假设引用任何碰巧是活动的工作单上的单元 A1 都是可以的。
用 Set 语句也可缩短定位字符串,并提供对代码更灵活的控制。下面的示例使用 Dim 和 Set 语句创建变量,使其引用经常使用的对象:
Dim xlRange As Object
Set xlRange = Application.ActiveSheet.Cells(1,1)
xlRange.Font.Bold = True
xlRange.Width = 40
Visual Basic 提供了 With...End With 语句,用来设置代码中隐含的对象:
With Application.ActiveSheet.Cells(1,1)
.Font.Bold = True
.Width = 40
End With
使用跨进程 ActiveX 部件,就不能完全避免产生跨进程调用。但是,有几种方法可减少跨进程的调用。如果可能,不要在 For...Next 循环中引用对象。将值缓存在变量中,然后在循环体中使用变量。若必须调用对象中大量的方法,通过将代码移入部件,可大大改进应用程序性能。例如,若部件是 Word 或 Microsoft Excel,可将循环宏放入 Word 的模板,或将循环过程放入 Microsoft Excel 模块。然后,从 Visual Basic 中调用宏或过程,这只是一次调用,它将在部件中引发一个循环操作。
在编写部件时,通过减少跨进程的调用可将部件中对象设计得更有效。例如,当有几个内关联的属性时,可使用带有多个参数的方法,其中,每个参数对应一个属性。无论方法带有多少个参数,调用方法只需一次跨进程调用,反之,设置每个属性则需一次单独的跨进程调用。同样地,如果预先知道,作为客户的部件将循环调用该部件(如,对 List 属性的所有值求和或求平均),那么,可提供在对象中完成循环的方法,然后返回适当的结果,这样可以改善程序性能。
详细信息 在 Visual Basic 专业版和企业版所提供的《部件工具指南》中深入讨论了部件的创建。