Является ли повторное использование переменной в VB6 хорошей идеей?
-
09-06-2019 - |
Вопрос
По сути, я хочу знать, было ли в VB.NET 2005 неправильно использовать sqlcommand, а затем повторно использовать его с помощью NEW.Приведет ли это к утечке памяти?
НАПРИМЕР:
try
dim mySQL as new sqlcommand(sSQL, cnInput)
// do a sql execute and read the data
mySQL = new sqlcommand(sSQLdifferent, cnInput)
// do sql execute and read the data
catch ...
finally
if mysql isnot nothing then
mysql.dispose
mysql = nothing
end if
Редактировать:вставьте try catch, чтобы избежать комментариев о том, что вы их не используете
Решение
Просто чтобы расширить то, что сказал Longhorn213, вот код для этого:
Using mysql as SqlCommand = new SqlCommand(sSql, cnInput)
' do stuff'
End Using
Using mysql as SqlCommand = new SqlCommand(otherSql, cnInput)
' do other stuff'
End Using
(редактировать) К вашему сведению, using автоматически обертывает блок кода вокруг try / finally, который вызывает метод Dispose для переменной, с помощью которой он создан.Таким образом, это простой способ убедиться, что ваш ресурс освобожден. http://msdn.microsoft.com/en-us/library/htd05whh (ПРОТИВ 80).aspx
Другие советы
Сборка мусора соберет первый новый файл при запуске.
Только второй вы намеренно помещаете в блок Finally.Первый из них будет удален при следующем запуске сборки мусора.
Я не думаю, что это хорошая идея.Если первая команда закрыта неправильно, возможно, у вас будет открытое соединение с базой данных, и она не будет удалена.
Лучшим способом было бы удалить первую команду после того, как вы закончите ее использовать, а затем повторно использовать.
Э-э, всем тем людям, которые говорят: "все в порядке, не беспокойтесь об этом, генеральный директор с этим справится..." весь точка из числа Dispose
шаблон состоит в том, чтобы обрабатывать эти ресурсы с помощью GC не могу утилизировать.Итак, если объект имеет Dispose
метод, вам лучше вызвать его, когда вы с ним закончите!
Подводя итог, Longhorn213 прав, прислушайтесь к нему.
Одна вещь, которую я так и не выяснил - есть ли у меня класс, реализующий IDisposable
, но на самом деле я никогда не утилизирую его сам, я просто оставляю его висеть без дела для GC, действительно ли GC вызовет Dispose
для меня?
Нет, сборщик мусора найдет старую версию MySQL и со временем освободит ее.
Сборщик мусора должен собирать все, что было разыменовано, до тех пор, пока оно не было перемещено в кучу больших объектов.
В то время как сборщик мусора будет убирать за вами в конце концов шаблон dispose предназначен для того, чтобы помочь системе быстрее освободить все ресурсы, связанные с объектом, поэтому вы должны вызвать dispose, как только закончите с объектом, прежде чем повторно назначить ему назначение.
Будь осторожен.Если вам приходится выполнять много таких действий в цикле, это может быть медленным.Гораздо лучше просто обновить свойство .CommandText той же команды, вот так (кроме того, вы можете немного почистить синтаксис):
Using mysql as New SqlCommand(sSql, cnInput)
' do stuff'
mySql.CommandText = otherSql
'do other stuff'
End Using
Конечно, это работает только в том случае, если первая команда больше не активна.Если вы все еще находитесь в процессе просмотра программы чтения данных, то вам лучше создать новую команду.