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

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

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

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

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

【问题讨论】:

标签: vba object memory-leaks constructor destructor


【解决方案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 时)

      【讨论】:

        猜你喜欢
        • 2015-12-05
        • 2013-07-07
        • 2016-12-28
        • 2011-04-03
        • 2010-12-16
        • 2011-12-27
        • 1970-01-01
        • 1970-01-01
        • 2013-07-14
        相关资源
        最近更新 更多