Excel VBA对象的构造函数和析构函数

26

我需要在VBA中创建一些自定义对象,它们需要相互引用,但是我遇到了一些问题。

首先,在VBA中对象的构造函数如何工作?是否有构造函数?

其次,是否有析构函数?VBA如何处理对象生命周期的结束?如果我有一个只引用其他对象的对象,那么我可以将其设置为“Nothing”并完成吗,还是会产生内存泄漏?

这种准面向对象的东西有点烦人。


1
关于向构造函数添加变量,请参见此StackOverflow问题 - GregNash
5个回答

27

VBA支持类模块。它们有一个Class_Initialize事件作为构造函数和一个Class_Terminate事件作为析构函数。你可以定义属性和方法。

我认为VBA使用引用计数来管理对象的生命周期。这就是为什么你会看到很多在那种类型代码中的Set whatever = Nothing. 在您的示例情况下,我认为它不会泄漏任何内存,但您需要小心循环引用。


17

如果您正在使用VBA制作类模块,可以使用以下构造函数:

Private Sub class_initialize()
....
End Sub

由于VBA拥有垃圾回收机制,因此不存在析构函数。只需确保清除任何循环引用,您就可以避免任何可能的内存泄漏。


13
这句话的意思是:“没有析构函数是不正确的,它应该是Class_Terminate。” - RubberDuck

9

存在Class_Terminate,它与析构函数几乎相同。


9

我已经很久没有使用它们了,但我认为你无法将参数传递到构造函数中。我认为这是我遇到的问题之一,但我遇到了如此多的问题,涉及到这些类的工作原理以及我期望它们的工作方式,所以我可能记错了。


更复杂的类通常会有“Start”类型的函数和一个“objectStarted”状态变量,以适应参数化构造函数的原则。 - Joel Goodwin

2

我确认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时才会调用)。


当使用Set时,将调用class_initialize。例如:Set myTestClass = new TestClass - Gr3go

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接