Excel VBA объект конструктор и деструктор - PullRequest
25 голосов
/ 21 февраля 2009

Мне нужно создать несколько пользовательских объектов в VBA, которые будут ссылаться друг на друга, и у меня возникли некоторые проблемы.

Первое - как работают конструкторы объектов в VBA? Есть конструкторы?

Второе - есть ли деструкторы? Как VBA обрабатывает конец жизненного цикла объекта? Если у меня есть объект, который ссылается на других (и это единственная ссылка), то могу ли я установить для него значение Ничего и покончить с этим или это может вызвать утечки памяти?

Этот квази-ОО материал немного раздражает.

Ответы [ 5 ]

24 голосов
/ 21 февраля 2009

VBA поддерживает классовые модули. У них есть событие Class_Initialize, которое является конструктором, и Class_Terminate, которое является деструктором. Вы можете определить свойства и методы. Я считаю, что VBA использует подсчет ссылок для жизненного цикла объекта. Вот почему вы видите много Set независимо = ничего в этом типе кода. В вашем примере, я думаю, он не будет пропускать память. Но вы должны быть осторожны с циклическими ссылками.

17 голосов
/ 21 февраля 2009

Если вы создаете модуль класса в VBA, для конструктора вы можете использовать:

Private Sub class_initialize()
....
End Sub

Деструкторов нет, так как VBA является сборщиком мусора. Обязательно удалите все циклические ссылки, и вам следует избегать любых возможных утечек памяти.

9 голосов
/ 21 февраля 2009

Прошло много времени с тех пор, как я их использовал, но я не думаю, что вы можете передавать параметры в конструкторы. Я думаю, что это была одна из проблем, с которыми я столкнулся, но я сталкивался с таким количеством проблем, как эти классы работали и как я ожидал, что они будут работать, что я могу запоминать.

7 голосов
/ 02 июня 2010

Существует Class_Terminate, который почти такой же, как деструктор.

1 голос
/ 01 марта 2017

Я подтверждаю, что 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 вызывается не при создании экземпляра (с новым), а только при первом вызове метода в экземпляре или при получении значения переменной.

Кажется, что class_terminate вызывается в конце testModule (если экземпляр создается на объекте Thisworkbook, terminate вызывается "никогда" ... возможно, только когда книга закрыта или Excel закрыт) * ​​1011 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...