本质上我想知道在 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(VS.80).aspx

其他提示

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

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

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

更好的方法是在使用完第一个命令后将其丢弃,然后重新使用它。

呃,对于所有那些说“没关系,不用担心,GC 会处理它......”的人 观点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