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

时间:2020-03-05 18:47:14  来源:igfitidea点击:

本质上,我想知道在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

当然,这仅在第一个命令不再处于活动状态时才有效。如果我们仍在浏览数据读取器,则最好创建一个新命令。