Если я устанавливаю переменную с помощью `CreateObject ()`, нужно ли ее очищать, устанавливая ее в `Nothing` после использования? - PullRequest
17 голосов
/ 16 ноября 2011

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

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

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

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

Ответы [ 3 ]

29 голосов
/ 16 ноября 2011

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

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

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

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

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

11 голосов
/ 16 ноября 2011

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

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 -использующий кусок кода на самом деле принадлежит своей собственной функции: -

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..

0 голосов
/ 13 марта 2019

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

...