1

本质上,我想知道在 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 以避免关于不使用它们的评论

4

7 回答 7

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

(编辑)就像仅供参考一样, using 自动将代码块包装在 try/finally 周围,该 try/finally 在创建它的变量上调用 Dispose 方法。因此,这是一种确保资源被释放的简单方法。http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx

于 2008-09-03T19:59:08.940 回答
2

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

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

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

更好的方法是在使用完第一个命令后处理它,然后重新使用它。

于 2008-09-03T19:54:07.407 回答
1

呃,对于那些说“没关系,不用担心,GC 会处理它......”的人来说Dispose模式的重点是处理那些 GC无法处理的资源。所以如果一个对象有一个Dispose方法,你最好在完成后调用它!

综上所述,Longhorn213 是对的,听他的。

于 2008-09-03T20:00:34.660 回答
1

我从来没有解决过的一件事-如果我有一个实现类IDisposable,但我自己从来没有真正处理过它,我只是把它留给 GC,GC 真的会打电话Dispose给我吗?

于 2008-09-03T20:25:56.190 回答
0

不,垃圾收集器会找到旧版本的 mySql 并在适当的时候将其释放。

垃圾收集器应该拾取任何被取消引用的东西,只要它没有被移动到大对象堆中。

于 2008-09-03T19:54:30.637 回答
0

虽然垃圾收集将在您最终清理后清理,dispose 模式可以帮助系统更快地释放与对象关联的任何资源,因此您应该在完成对象后调用 dispose,然后再重新分配给它。

于 2008-09-03T20:00:16.190 回答
0

当心。如果你必须在一个循环中做很多这些,它可能会很慢。最好只更新同一命令的 .CommandText 属性,如下所示(另外,您可以稍微清理一下语法):

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

    mySql.CommandText = otherSql

   'do other stuff'
End Using

当然,这仅在第一个命令不再有效时才有效。如果您仍在使用数据读取器,那么您最好创建一个新命令。

于 2008-09-04T03:04:06.780 回答