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

Posted

技术标签:

【中文标题】Excel VBA 对象构造函数和析构函数【英文标题】:Excel VBA object constructor and destructor 【发布时间】:2010-10-08 22:49:36 【问题描述】:

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

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

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

这种准OO的东西有点烦人。

【问题讨论】:

要向构造函数添加变量,请参阅[this *** question][1]。 [1]:***.com/questions/15224113/… 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

Private Sub class_initialize()
....
End Sub

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

【讨论】:

没有析构函数是不正确的。这是 Class_Terminate【参考方案3】:

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

【讨论】:

更复杂的类通常具有“Start”类型的函数和“objectStarted”状态变量,以适应​​参数化构造函数的原理。【参考方案4】:

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

【讨论】:

【参考方案5】:

我确认 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

然后您将在调试窗口中看到日志。但是通过这个测试,我们可以看到 class_initialize 在您创建实例(使用 new)时不会被调用,而只会在实例中第一次调用方法或获取 var 值时调用。

class_terminate 似乎在 testModule 结束时被调用(如果在 Thisworkbook 对象上创建实例,则“从不”调用终止...可能仅在关闭工作簿或关闭 Excel 时)

【讨论】:

以上是关于Excel VBA 对象构造函数和析构函数的主要内容,如果未能解决你的问题,请参考以下文章

c++中的构造函数和析构函数

简述构造函数和析构函数的作用

构造函数和析构函数能不能被继承

[类和对象]构造和析构

python中的构造函数和构造函数和析构函数的作用

构造函数和析构函数