重用VB6中的变量是一个好主意吗?

时间:2008-09-03 19:51:04

标签: .net vb.net memory-leaks garbage-collection

基本上我想知道在VB.NET 2005中是否使用sqlcommand然后使用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 个答案:

答案 0 :(得分: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一样,使用自动包围try / finally的代码块,该代码块在创建它的变量上调用Dispose方法。因此,这是确保释放资源的简便方法。 http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx

答案 1 :(得分:2)

垃圾收集将在运行时收集第一个新的。

只有你故意在Finally块中处理的第二个。第一个将在下次运行垃圾收集时被处理掉。

我不认为这是个好主意。如果第一个命令未正确关闭,则可能会与数据库建立打开连接,并且不会被丢弃。

更好的方法是在完成第一个命令后再使用它,然后再重复使用它。

答案 2 :(得分:1)

呃,对所有那些说“没关系,不要担心,GC会处理它......”Dispose模式的整个的人来说处理GC 无法处理的那些资源。因此,如果一个对象有一个Dispose方法,那么当你完成它时最好调用它!

总之,Longhorn213是正确的,请听他说。

答案 3 :(得分:1)

我从来没有做过的一件事 - 如果我有一个实施IDisposable的课程,但我自己从未实际处理过,我只是将它留在GC周围,GC实际上会调用Dispose对我来说?

答案 4 :(得分:0)

不,垃圾收集器会找到旧版本的mySql并在适当的时候解除分配。

垃圾收集器应该拾取任何已被解除引用的内容,只要它没有被移动到大对象堆中。

答案 5 :(得分:0)

虽然最终之后垃圾收集会清理,但是配置模式可以帮助系统更快地释放与该对象相关的任何资源,所以你应该在完成对象之前调用dispose重新分配。

答案 6 :(得分:0)

小心点。如果你必须在一个循环中做很多这些,它可能会很慢。只更新同一命令的.CommandText属性要好得多(同样,你可以稍微清理一下语法):

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

    mySql.CommandText = otherSql

   'do other stuff'
End Using

当然,只有在第一个命令不再有效时才有效。如果您仍然在通过datareader,那么最好创建一个新命令。