Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Set {Object} = Nothing


Автор: ИгнатьевАлексей 23.12.2007, 11:11
Друзья! Подскажите, зачем в конце проги присваювают значение Nothing объекту?

Вот, например, в таком случае:
Код

Set applAcad = New AcadApplication
.....
applAcad.Quit
Set applAcad = Nothing


Пишу  Set applAcad = Nothing автоматом, а зачем это - не понимаю.  smile  Ведь при завершении программы та память, которая была выделена под переменные, освобождается и так... Или не все так просто в датском королевстве? 

Автор: Naghual 24.12.2007, 00:12
Не все так просто...  Совсем не Так все Просто...
smile

Автор: Akina 24.12.2007, 00:35
Цитата(ИгнатьевАлексей @  23.12.2007,  12:11 Найти цитируемый пост)
зачем в конце проги присваювают значение Nothing объекту?

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

Автор: ИгнатьевАлексей 24.12.2007, 10:07
Akina,  можно я напишу фразу, а вы, мастер, скажете - правильно я рассуждаю, или нет... Можно?

В начале текста программы я написал:
Код

Dim a As Boolean

в конце 
Код

End Sub

Это значит, что при выполнении, программа в точке Dim a As Boolean выделила свободную память под переменную a, а в точке End Sub освободила эту память. Это присуще языкам высокого уровня.
Так или нет? Скажите, плз.

Автор: Akina 24.12.2007, 10:24
Цитата(ИгнатьевАлексей @  24.12.2007,  11:07 Найти цитируемый пост)
Так или нет?

Так.
Однако переменная - это на 100% внутреннее дело программы, и она гарантированно будет очищена правильно.
Совсем другое дело - объект. Его создали и дергали за разные выступающие части, а он в свою очередь тоже куда-то лазил, где-то что-то у кого-то просил... и если его прибить, то вовсе не факт, что запрошенные им для выполнения затребованных операций ресурсы будут отпущены, очищены и закрыты правильно при неявном закрытии. Особенно это относится к асинхронным операциям в многомодульных проектах. Garbage Collection хоть и написан хорошо, но всех случаев предусмотреть не в силах.

Простейший пример: вызовите любой СОМ-объект (скажем, Excel.Application), закройте его... а СОМ-сервер останется висеть в памяти. Впрочем, пример не корректен, ибо не та причина - но смысл его приблизительно тот же.

В общем, это такой же признак "правильного" программирования, как, например, явная декларация всех переменных в определенный (не Variant - когда это возможно, конечно) тип или, например, не-использование goto...

Автор: ИгнатьевАлексей 24.12.2007, 10:38
Akina, огромное спасибо за обстоятельное разъяснение!
Таким образом, для каждого Set (что-то) As (какой то объект) следует в конце поставить Set (что-то) = Nothing. Включая и объект Range. Правильно?

Автор: Akina 24.12.2007, 12:28
Хуже. Для каждого типа объекта следует использовать свои заморочки. Например Recordset перед явным =Nothing надо столь же явно .Close...

Автор: ИгнатьевАлексей 24.12.2007, 13:44
Akina, понял..... 
Никто ведь и не говорил, собственно, что программист-простая профессия... smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)