Если я устанавливаю переменную с помощью `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
.