你可能会非常惊奇:Friend类型过程的执行速度要明显快于Public类型。这可以通过创建一个带有Private类和Public类 (设定Instancing = MultiUse)的ActiveX EXE工程看到,在2个类模块中添加下面的代码: Public Sub PublicSub(ByVal value As Long) ’ End Sub Public Function PublicFunction(ByVal value As Long) As Long ’ End Function Friend Sub FriendSub(ByVal value As Long) ’ End Sub Friend Function FriendFunction(ByVal value As Long) As Long ’ End Function 然后,在表单模块中创建一个循环,执行每个例程许多次。比如,要在一个Pentium II机器上查看执行时间上的区别,可以调用每个例程1,000,000次。下面是测试的结果: Private类模块中,反复调用1,000,000次Public Sub或者Function耗费了0.46秒,而调用内容相同的Friend类型模块则分别只有0.05秒和0.06秒。前后竟然相差了8-9倍之多!对于MultiUse类型的Public类模块,也是一样的结果。 对于这个不可思议的结果的可能解释是:Friend型过程没有处理汇集和拆装代码的消耗(Public过程可以从当前工程外被调用,因此COM必须要来回地汇集数据)。 但是在多数情况下,这些时间差别是不明显的,特别是程序中包含一些复杂和耗时的语句时。 即使这样,Friend型过程仍有其他的优势高于Public类型,比如:接受和返回在BAS模块中定义的UDT变量的能力。 使用Objptr函数快速查找集合中的对象 ObjPtr函数的一个最简单但是却最有效的用途就是提供快速寻找集合中对象的关键字。假设有一个对象集合,它没有可以当做关键字以从集合中取回的属性。那么,我们就可以使用ObjPtr函数的返回值作为集合中的关键字: Dim col As New Collection Dim obj As CPerson ’创建新的CPerson对象,并添加到集合中 Set obj = New CPerson obj.Name = "John Smith" col.Add obj, CStr(ObjPtr(obj)) ’关键字必须是字符串 因为任何对象都有一个明确的ObjPtr数值,而且它是不变的,所以,我们可以容易地、快速地从集合中取回它: ’ 删除集合中的对象 col.Remove CStr(ObjPtr(obj)) 这个技巧可以适用于任何类型的对象,包括VB中的表单和控件,以及外部对象。 使用ObjPtr检测2个对象变量是否指向同一对象 判断2个对象变量释放指向同一对象的方法是使用Is操作符,代码如下: If obj1 Is obj2 Then ... 但当2个对象是同一类型时,或者指向同一个二级接口时,我们就可以利用ObjPtr()函数对代码进行一些优化处理: If ObjPtr(obj1) = ObjPtr(obj2) Then ... 后者的执行速度将比前种方法快40%多。但是请注意,2种方法原本就是很有效率的,只有在时间要求非常严格的上百成千次的循环中,才会体现出这种差别。