2008-09-03 1 views
1

По сути, я хочу знать, если в VB.NET 2005, если использовать sqlcommand, а затем повторно использовать его с помощью NEW, это неправильно. Это вызовет утечку памяти.Повторное использование переменной в VB6 - хорошая идея?

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 

EDIT: положить попробовать поймать, чтобы избежать комментариев о не используя их

ответ

6

Просто продлить то, что сказал 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 

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

2

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

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

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

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

0

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

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

0

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

1

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

Таким образом, Longhorn213 верен, послушайте его.

1

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

+0

Нет (http://blogs.msdn.com/b/clyon/archive/2004/09/21/232445.aspx) – 2013-12-23 20:31:35

0

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

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

    mySql.CommandText = otherSql 

    'do other stuff' 
End Using 

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

Смежные вопросы