我需要在 VBA 中创建一些需要相互引用的自定义对象,但我遇到了一些问题。
首先 - 对象构造函数如何在 VBA 中工作?有构造函数吗?
第二 - 有析构函数吗?VBA 如何处理对象生命周期的结束?如果我有一个引用其他对象的对象(这是他们唯一的引用),那么我可以将它设置为 Nothing 并完成它还是会产生内存泄漏?
这种准 OO 的东西只是有点烦人。
我需要在 VBA 中创建一些需要相互引用的自定义对象,但我遇到了一些问题。
首先 - 对象构造函数如何在 VBA 中工作?有构造函数吗?
第二 - 有析构函数吗?VBA 如何处理对象生命周期的结束?如果我有一个引用其他对象的对象(这是他们唯一的引用),那么我可以将它设置为 Nothing 并完成它还是会产生内存泄漏?
这种准 OO 的东西只是有点烦人。
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
然后你会在调试窗口中看到日志。但是通过这个测试,我们可以看到 class_initialize 在您创建实例(使用 new)时不会被调用,而只会在实例中第一次调用方法或获取 var 值时调用。
class_terminate 似乎在 testModule 结束时被调用(如果在 Thisworkbook 对象上创建实例,则“从不”调用终止...可能仅在工作簿关闭或 Excel 关闭时调用)