Является ли повторное использование переменной в VB6 хорошей идеей?

StackOverflow https://stackoverflow.com/questions/42422

Вопрос

По сути, я хочу знать, было ли в 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top