在 VB6 中重用变量是个好主意吗?
-
09-06-2019 - |
题
本质上我想知道在 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
当然,只有当第一个命令不再有效时才有效。如果您仍在使用数据读取器,那么您最好创建一个新命令。