Если я устанавливаю переменную с помощью `CreateObject()`, мне нужно ее очистить, установив ее в "Nothing" после использования?

Если я устанавливаю переменную с помощью CreateObject(), мне нужно ее очистить, установив ее в Nothing после использования?

Dim foo
Set foo = CreateObject("SomeAssembly")
foo Bar
Set foo = Nothing

Я только что нашел этот пост Эрик Липперт:

Механизм script автоматически очистит эти переменные, когда они выйдут из области видимости, поэтому очистка их утверждения до того, как они выйдут из области видимости, кажется бессмысленной.

Ответы

Ответ 1

Если я устанавливаю переменную с помощью CreateObject(), нужно ли ее очищать, не устанавливая ее после использования?

Обычно вы этого не делаете, но это стало известно в сообществе VB. Если вы - сверхспособный человек, вам не помешает отразить дурной глаз, установив переменные в Nothing, когда вы закончите с ними, но он тоже ничего не помогает.

Редкими случаями, когда вам нужно установить переменную в Nothing, являются те случаи, когда:

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

Если я не в одном из этих случаев, я не устанавливаю переменные в Nothing. У меня никогда не было проблем с этим.

Ответ 2

Я редко делаю это: -

Set foo = Nothing 

Вот почему...

Рассмотрим: -

Function DoStuff()
    Dim foo : Set foo = CreateObject("lib.thing")
    ''# Code that uses foo
    Set foo = Nothing
End Function

Так как foo вот-вот выйдет из области действия, в любом случае назначение Nothing в foo является излишним, поэтому я не беспокоюсь.

Рассмотрим: -

Function DoStuff()
    Dim foo : Set foo = CreateObject("lib.thing")
    ''# Code that uses foo
    Set foo = Nothing
    ''# Loads more code that doesn't use foo
End Function

Теперь это случай, когда назначение Nothing имеет смысл, поскольку в противном случае оно удерживается потенциально намного дольше, чем это необходимо. Однако в таких случаях код является кандидатом на рефакторинг. Тот факт, что функция продолжает делать гораздо больше материала, не нуждающегося в foo, указывает, что блок foo -using-кода действительно принадлежит в своей собственной функции: -

Function DoStuff()
    ''# Code that calls FooUsage
    ''# Loads more code that doesn't use foo
End Function

Function FooUsage(someParams)
    Dim foo : Set foo = CreateObject("lib.thing")
    ''# Code that uses foo
    FooUsage = someResult
End Function

Есть случаи, когда назначение Nothing для целей освобождения памяти целесообразно, но я делаю это в особых случаях. В нормальном коде я считаю, что это редко необходимо.

Возможно, одним из драйверов, стоящих за лагерем "Всегда задано ни к чему", является то, что многие VBScripters записывают последовательные сценарии, которые не учитываются в процедурах Function и Sub.