Является ли повторное использование переменной в VB6 хорошей идеей? - PullRequest
1 голос
/ 03 сентября 2008

По сути, я хочу знать, является ли неправильным использование VB.NET 2005 с использованием команды sql, а затем ее повторное использование с использованием NEW. Это приведет к утечке памяти.

EG:

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, чтобы избежать комментариев по поводу их неиспользования

Ответы [ 7 ]

6 голосов
/ 03 сентября 2008

Просто чтобы расширить сказанное 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

(edit) Так же, как FYI, использование автоматически оборачивает блок кода вокруг try / finally, который вызывает метод Dispose для переменной, с которой он создан. Таким образом, это простой способ обеспечить освобождение вашего ресурса. http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx

2 голосов
/ 03 сентября 2008

Сборщик мусора соберет первый новый при запуске.

Только второй, который вы намеренно выбрасываете в блок «Наконец». Первый будет удален при следующем запуске сборки мусора.

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

Лучшим способом было бы избавиться от первой команды после ее использования, а затем повторно использовать.

1 голос
/ 04 сентября 2008

Одна вещь, с которой я никогда не справлялся - если у меня есть класс, реализующий IDisposable, но я на самом деле никогда не распоряжаюсь им самим, я просто оставляю его без присмотра для GC, GC на самом деле для меня назовет Dispose?

1 голос
/ 04 сентября 2008

Э-э, всем тем людям, которые говорят: «Все в порядке, не беспокойтесь об этом, GC с этим справится ...». Весь пункт шаблона Dispose предназначен для обработки этих ресурсов. GC не может утилизировать. Поэтому, если у объекта есть метод Dispose, вам лучше вызвать его, когда закончите с ним!

Итак, Longhorn213 прав, слушайте его.

0 голосов
/ 04 сентября 2008

Будь осторожен. Если вам нужно сделать много таких циклов, это может быть медленным. Гораздо лучше просто обновить свойство .CommandText той же команды, например так (также вы можете немного очистить синтаксис):

Using mysql as New SqlCommand(sSql, cnInput)
  ' do stuff'

    mySql.CommandText = otherSql

   'do other stuff'
End Using

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

0 голосов
/ 04 сентября 2008

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

0 голосов
/ 03 сентября 2008

Нет, сборщик мусора найдет старую версию mySql и со временем освободит ее.

Сборщик мусора должен собирать все, что было разыменовано, если оно не было перемещено в кучу больших объектов.

...