我总是读到推荐对象设置为无,一旦我跟他们做。但我通常只在函数中使用它们的内部的形式。

不是参考丢失和存储器释放时,功能范围被留下的,而不管对象设置为Nothing?

即。是真的有必要做到:

Set db = Nothing
Set record_set = Nothing
有帮助吗?

解决方案

VB使用所谓的“引用计数”垃圾收集器。

基本上,一个变量超出范围的瞬间,被引用的对象上的参考计数器递减。当分配对象引用到另一变量,参考计数器被递增。

当计数器到达零时,对象是准备用于垃圾收集。在对象资源将尽快出现这种情况公布。的函数的局部变量将最有可能引用一个对象,其引用计数永远不会大于1,所以对象的资源将被释放,当函数结束。

设置一个变量来Nothing是明确地降低基准计数器的方式。

例如,你在一个文件中读取,并设置文件对象变量Nothing呼叫后立即ReadAll()。该文件句柄将被立即释放,你可以把你的时间过程的内容。

如果您没有设置Nothing,文件句柄可能会开放长于绝对必要的。

如果您不是在一个“必须解除阻止宝贵的资源”这种情况,只是让变量超出范围是好的。

其他提示

垃圾收集很少是完美的。即使是在.NET有次你在哪里强烈建议提示系统提前做垃圾回收。

为此,我明确双方的关闭并设置为没有的记录时,我要和他们一起做。

帮助主题的最后一行的“ Recordset.Close ”在Microsoft DAO帮助和Access开发人员参考是这样的:

  

“来Close方法的替代方案是   设置一个对象变量的值   为Nothing(设置dbsTemp =无)。“

http://msdn.microsoft.com/en-us/library/ bb243098.aspx

考虑到这一点,题为从Microsoft知识库文章“如何防止数据库臃肿您使用后的数据访问对象(DAO)”,告诉你,你应该明确地接近,如果你不想让你的数据库膨胀。你会注意到,这一条有点含糊的细节; “原因”部分不清,几乎到了被胡言乱语的地步。

http://support.microsoft.com/kb/289562

  

症状:Microsoft Access数据库   已经开始臃肿(或快速增长   大小)您实现数据访问后   对象(DAO)打开记录。

     

原因:如果不释放   每一次记录的记忆,你   通过记录代码,DAO环   可以重新编译,使用更多的存储器和   增加数据库的大小。

     

更多信息:当您创建一个   记录(或一个QueryDef)对象在   代码,显式关闭对象时   你完蛋了。微软访问   自动关闭和记录   下的QueryDef对象大多数   情况。但是,如果您   明确关闭对象的   代码,就可以避免偶然   物体保持时实例   开。

最后,让我补充一点,我一直与Access数据库工作了15年,我几乎总是让我的本地声明记录变量超出范围不明确使用Close方法。我没有做过的任何测试,但它似乎并不重要。

参考应该当变量超出范围被清理。据推测,这已与软件的更新版本改进,但它是在同一时间不可靠的。我认为,它仍然是一个很好的做法,明确设置变量“没什么。”

当您使用ASP经典(服务器端脚本),它是进口的所有对象设置为无,当你通过与他们,因为他们不出去的范围,直到[虚]服务器关闭。

由于这个原因,所有的MS VB脚本示例总是显示被关闭并设置为任何对象。这样脚本摘录可以像ASP经典的环境中使用,其中的对象并没有超出范围。

有,很少,你想在那里的对象不出去的范围,你会发现自己跑出来的物理内存,如果你不明确地释放对象。编写长时间运行的进程的其他情形

如果你发现自己的编码ASP经典,或运行在全球范围内处理一些其他原因,那么,你应该明确地释放对象。

我平时总是把这个在我的程序结束,或致电与它“CloseRecordSet”子中,如果我使用的是模块级的:

Private Sub Rawr()
On Error GoTo ErrorHandler

    'Procedural Code Here.

    ExitPoint:
        'Closes and Destroys RecordSet Objects.
        If Not Recset Is Nothing Then
            If Recset.State = 1 Then
                Recset.Close
                Conn.Close
            End If
            Set Recset = Nothing
            Set Conn = Nothing
        End If
        Exit Sub

    ErrorHandler:
        'Error Handling / Reporting Here.
        Resume ExitPoint
End Sub

这样然而在过程结束,(无论是正常或由于错误)对象被清理和资源是免费的。

做这样的说法是,它非常安全的,你可以只拍它,它只会做什么的问候关闭或销毁记录/连接对象,是必要的柜面它已经关闭(由于运行时错误或只是关闭它早在亚应,这只是确保)。

它真的没有太多的麻烦和它总是最好的,当你与他们完成腾出资源立即无论在节目中发生了什么,清理你的对象。

尝试此

If Not IsEmpty(vMyVariant) Then
    Erase vMyVariant
    vMyVariant = Empty
End If
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top