可以通过优化 Visual Basic 处理对象引用的方法,使得 Visual Basic 应用程序运行得更快。Visual Basic 处理对象引用的速度能受到下列因素影响:
一般说来,如果一个部件已作为可执行文件(.exe 文件)的一部分被实现,那么它是一个进程外的服务器
,且在其自己的进程中运行。如果它作为一个动态链接库被实现,那么它是一个进程内的服务器
,而且在和客户端应用程序同一进程中运行。
使用进程内的服务器的应用程序比使用进程外的服务器的应用程序,运行速度要快些,因为应用程序不需要跨越过程的边界去使用对象的属性、方法和事件。关于进程内的服务器与进程外的服务器的更详细的信息,请参阅“进程内的服务器与进程外的服务器”一节。
如果对象引用使用的对象变量被声明为一个特定类的变量,则对象引用是事前绑定。如果对象引用使用的对象变量被声明为一个一般的 Object 类的变量,则对象引用是后期绑定。通常,使用事前绑定变量的对象引用比使用后期绑定变量,运行得快些。
例如,可以将对于 Excel 对象的引用赋予下列变量中的任意一个:
Dim xlApp1 As Excel.Application
Set xlApp1 = New Excel.Application
Dim xlApp2 As Object
Set xlApp2 = CreateObject("Excel.Application")
使用变量 xlApp
l 的代码是事前绑定,它比使用后期绑定变量 xlApp
2 的代码执行的更快。
当声明一个变量 As Object,Visual Basic 在编译期间不能决定该变量含有的对象引用是什么性质的。在这种情况下,Visual Basic 必须使用后期绑定
— 即 Visual Basic 必须在运行期间才能决定,对象是否实际上具有代码中要使用的属性和方法。
例如,即便 Visual Basic 引用并不存在的方法,它也会不出错误地编译下列代码,这是因为它使用了后期绑定对象变量。直至运行时之前,它并不检查方法的存在性,所以将产生运行时错误。
Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application")
xlApp.TheImpossibleMethod ' Method doesn't exist.
这个代码比使用事前连结对象变量的代码运行得要慢些,因为 Visual Basic 在编译好的可执行代码中,还必须含有一段代码,它在运行时决定 Microsoft Excel Application 对象是否具有 TheImpossibleMethod 方法。
虽然后期绑定是调用对象的属性和方法的一种最慢的方法,但有时它又是必要的。例如,有时可能需要写这样一个函数,它用一个对象变量作用于若干不同类型对象的任一个。因为,在事先并不知道什么类的对象会赋给这个变量,所以要使用 As Object 声明它是后期绑定的变量。
如果 Visual Basic 在编译期间可以检测属性或方法属于什么对象,那么引用对象的问题在编译期间就能解决。编译好的可执行的代码仅包含引用对象的属性、方法和事件的代码。这被称为事前绑定
。
当使用定义对象的类声明对象变量时,该变量可仅包含对那个类的对象的引用。对使用该变量的任何代码,Visual Basic 都可使用事前绑定。
事前绑定极大地减少了设置或恢复属性值所需的时间,因为调用的开销会占据总时间的大部分。对于方法的调用,这种改善的程度取决于所调用的方法的工作量。短的方法,因为调用的开销可以与完成该任务所需的时间相比拟,所以收效最大。