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

时间:2009-02-20 21:37:37

标签: vba object memory-leaks constructor destructor

我需要在VBA中制作一些需要互相引用的自定义对象,我有一些问题。

首先 - 对象构造函数如何在VBA中工作?有施工人员吗?

第二 - 有破坏者吗? VBA如何处理对象生命周期的结束?如果我有一个引用其他对象的对象(这是他们唯一的引用),那么我可以将它设置为Nothing并用它完成或者是否会产生内存泄漏?

这种准OO的东西只是有点刺激。

5 个答案:

答案 0 :(得分:24)

VBA支持类模块。它们具有构造函数的Class_Initialize事件和作为析构函数的Class_Terminate。您可以定义属性和方法。 我相信VBA使用对象生命周期的引用计数。这就是为什么你会在那种类型的代码中看到很多Set whatever = Nothing的原因。在您的示例中,我认为它不会泄漏任何内存。但是你需要注意循环引用。

答案 1 :(得分:17)

如果要在VBA中创建类模块,对于构造函数,可以使用:

Private Sub class_initialize()
....
End Sub

没有析构函数,因为VBA是垃圾收集的。只要确保清理任何循环引用,就应该避免任何可能的内存泄漏。

答案 2 :(得分:9)

自从我使用它们已经有一段时间了,但我认为你不能将参数传递给构造函数。我认为那是我遇到的问题之一,但我遇到了很多关于这些课程如何运作的问题以及我希望它们如何工作,我可能会记错了。

答案 3 :(得分:7)

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

答案 4 :(得分:1)

我确认了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,而只是在第一次调用实例中的methode或获取var值时才会调用它。

class_terminate似乎在testModule的末尾被调用(如果实例在Thisworkbook对象上生成,则终止是"从不"调用...可能仅在工作簿关闭或Excel是闭)