我需要在VBA中创建一些自定义对象,它们需要相互引用,但是我遇到了一些问题。
首先,在VBA中对象的构造函数如何工作?是否有构造函数?
其次,是否有析构函数?VBA如何处理对象生命周期的结束?如果我有一个只引用其他对象的对象,那么我可以将其设置为“Nothing”并完成吗,还是会产生内存泄漏?
这种准面向对象的东西有点烦人。
我需要在VBA中创建一些自定义对象,它们需要相互引用,但是我遇到了一些问题。
首先,在VBA中对象的构造函数如何工作?是否有构造函数?
其次,是否有析构函数?VBA如何处理对象生命周期的结束?如果我有一个只引用其他对象的对象,那么我可以将其设置为“Nothing”并完成吗,还是会产生内存泄漏?
这种准面向对象的东西有点烦人。
VBA支持类模块。它们有一个Class_Initialize事件作为构造函数和一个Class_Terminate事件作为析构函数。你可以定义属性和方法。
我认为VBA使用引用计数来管理对象的生命周期。这就是为什么你会看到很多在那种类型代码中的Set whatever = Nothing. 在您的示例情况下,我认为它不会泄漏任何内存,但您需要小心循环引用。
如果您正在使用VBA制作类模块,可以使用以下构造函数:
Private Sub class_initialize()
....
End Sub
由于VBA拥有垃圾回收机制,因此不存在析构函数。只需确保清除任何循环引用,您就可以避免任何可能的内存泄漏。
存在Class_Terminate,它与析构函数几乎相同。
我已经很久没有使用它们了,但我认为你无法将参数传递到构造函数中。我认为这是我遇到的问题之一,但我遇到了如此多的问题,涉及到这些类的工作原理以及我期望它们的工作方式,所以我可能记错了。
我确认class_initialize和class_terminate。
您可以通过编写此TestClass来检查:
Public testVar As Integer
Private Sub class_initialize()
Debug.Print "Class init"
testVar = 10
End Sub
Private Sub class_terminate()
Debug.Print "Class terminate"
End Sub
在一个模块中编写以下代码:
Sub test()
Dim myTestClass As New TestClass
Debug.Print myTestClass.testVar
End Sub
然后您将在调试窗口中看到日志。但是通过这个测试,我们可以看到当您创建实例(使用new)时,并没有调用class_initialize方法,而仅在第一次调用实例的方法或获取变量值时才会调用。
class_terminate似乎在testModule结尾处被调用(如果一个实例被标记为Thisworkbook对象,则“从不”调用terminate...可能仅在关闭工作簿或关闭Excel时才会调用)。