在VB6中重用变量是个好主意吗?
本质上,我想知道在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
编辑:尝试插入避免使用不使用它们的评论
解决方案
回答
垃圾收集将在运行时收集第一个新垃圾。
我们仅将第二个故意放置在Final块中。第一个将在下次运行垃圾收集时被丢弃。
我认为这不是一个好主意。如果第一个命令未正确关闭,则可能与数据库建立了开放连接,并且该数据库不会被处置。
更好的方法是在使用完第一个命令后将其丢弃,然后重新使用它。
回答
不,垃圾收集器会找到旧版本的mySql并在适当的时候取消分配。
只要垃圾回收器尚未移入大对象堆中,它就应该将其取消引用。
回答
只是为了扩展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 / final周围,该try / finally会在创建它的变量上调用Dispose方法。因此,这是确保资源被释放的简便方法。 http://msdn.microsoft.com/zh-CN/library/htd05whh(VS.80).aspx
回答
尽管最终将有处置模式之后,垃圾收集将被清理,以帮助系统更快地释放与该对象相关联的任何资源,所以在对对象完成处理后,应重新调用它,然后再对其进行分配。
回答
嗯,对所有那些说"没关系,不用担心,GC会处理..."的人来说,Dispose模式的全部要点是处理GC无法处理的资源。因此,如果对象具有Dispose
方法,则最好在完成后调用它!
总而言之,Longhorn213是正确的,听他的话。
回答
我从来没有解决过的一件事:如果我有一个实现" IDisposable"的类,但是我从来没有真正自己处置过,我就把它留给GC了,GC会为我实际调用" Dispose"吗?
回答
当心。如果我们必须循环执行许多此类操作,可能会很慢。最好像这样更新同一命令的.CommandText属性(同样,我们可以稍微清理一下语法):
Using mysql as New SqlCommand(sSql, cnInput) ' do stuff' mySql.CommandText = otherSql 'do other stuff' End Using
当然,这仅在第一个命令不再处于活动状态时才有效。如果我们仍在浏览数据读取器,则最好创建一个新命令。