**Public Sub ExecuteQuery(ByVal pQueryString As String, Optional ByVal pConn As Odbc.OdbcConnection = Nothing)
Dim Mycmd As New Odbc.OdbcCommand(pQueryString, MyConn)
Mycmd.ExecuteNonQuery()
Mycmd.Dispose()
End Sub**
这里我使用Dispose(Mycmd.Dispose())清除对象。我可以在这里使用Nothing(Mycmd = Nothing?。哪个最好?
请帮助我先生,
通过
了Arul。
答案 0 :(得分:7)
Dim Mycmd As New Odbc.OdbcCommand(pQueryString, MyConn)
此命令将New Odbc.OdbcCommand(pQueryString,MyConn)创建的对象的引用存储到Mycmd中,即Mycmd基本上具有新创建的对象的地址。
现在当你做
Mycmd.Dispose()
然后它表示新创建的对象的使用已经结束,并且在垃圾回收期间可以释放分配给该对象的空间。
但是当你做的时候
Set Mycmd = Nothing
然后它只是从Mycmd中删除新创建的对象的引用,它不会将其标记为垃圾回收。
答案 1 :(得分:4)
.net对象通常会要求其他实体(可能或可能不在同一台计算机上)代表他们“做某事”(*),并且这些实体将继续这样做,除非或直到他们被告知停止。这些对象应该实现IDisposable,并且它们的IDisposable.Dispose例程应该通知任何代表他们做某事的实体,停止这样做。如果对IDisposable对象的所有引用都将在没有首先调用Dispose的情况下消失,那么其他一些实体可能会永久地继续无用地代表一个早已不复存在的对象做某事。
(*)“做某事”可能是任何事情,包括阻止其他要求做某事。例如,对象可能会要求操作系统对文件进行独占访问,操作系统可能会将该请求转发给另一台计算机。如果对象在不再需要访问该文件时未通知操作系统,则服务器可能会无限期地将Universe中的其他所有人锁定在该文件之外。
为了尽量减少实体永久代表被遗弃物品的问题,.net提供了一种方法,通过这种方式,对象可以在被放弃时通知它们。如果放弃重写Object.Finalize()的对象,那么.net通常会调用该对象的Finalize()方法的覆盖。大多数情况下,这种类型很有用,但几乎不应该依赖它。设计一个类非常困难,因此Finalize()将始终做正确的事情,从不做错事。除此之外,如果一个人不小心,.net可能会在一个它确定将被放弃的对象上调用Finalize(),即使该对象与外部实体进行交互也是如此。这将永远不会发生在正确调用对象上的Dispose的代码中,但可能发生在依赖于Finalize()的代码中。
答案 2 :(得分:1)
如果您的意思是将值Nothing分配给对象,如下所示:
Set Mycmd = Nothing
这实际上并没有在信号作为垃圾收集的对象准备或释放对象的已用资源方面做任何事情。
在VB6中,将对象设置为Nothing是释放对象资源的正确方法,但现在调用Dispose方法是正确的。如果对象没有实现IDisposable,那么你可以简单地保留它们。
垃圾收集将在自己的时间内发生(甚至没有调用.Dispose())。
答案 3 :(得分:0)
没有任何.nothing()方法来释放对象资源。您可以使用dispose和nothing来释放对象资源。但是在实现IDisposable接口时使用dispose。如果您使用的是自定义类。 .net内置对象已经具有此功能,但如果您的对象已引用,则它可以正常工作,否则会出错。你可以使用
命令=无
对于所有对象.net框架或自定义。两者都是发布对象。