Dispose和Nothing之间的区别

4
 **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)吗?哪个更好?

请帮助我,先生。

谢谢。


OdbcCommand对象上真的有一个.Nothing()方法吗,还是你将对象设置为Nothing? - David Hall
1
这里有一些关于你的问题的好讨论:http://bytes.com/topic/net/answers/726065-set-object-nothing-do-you-still-do-vb-net - David Hall
4个回答

7
Dim Mycmd As New Odbc.OdbcCommand(pQueryString, MyConn)

这个命令将由New Odbc.OdbcCommand(pQueryString, MyConn)创建的对象的引用存储到Mycmd中,也就是说,Mycmd基本上会有新创建的对象的地址。

现在当你执行

Mycmd.Dispose()

当一个新对象被创建后,如果它不再使用,那么就意味着可以在垃圾回收期间释放为该对象分配的空间。

但是,当你执行以下操作时

Set Mycmd = Nothing

然后它只是从Mycmd中删除了新创建对象的引用,但没有将其标记为垃圾回收。


我已经完全理解了。现在我只是消除了那个疑惑。非常感谢您,先生。 - Arul

4
经常情况下,.net对象会要求其他实体(可能甚至不在同一台计算机上)代表它们“做某事”(*),这些实体将继续这样做,除非被告知停止。这样的对象应该实现IDisposable接口,并且它们的IDisposable.Dispose例程应该通知任何和所有曾经代表它们做事情的实体停止这样做。如果对一个IDisposable对象的所有引用都消失了,而没有先调用Dispose,那么一些其他实体可能会永远地无用地代表已经不存在的对象继续做某事。
(*) “做某事”可以是任何事情,包括阻塞其他请求来做某事。例如,一个对象可能会请求操作系统独占访问文件,而操作系统可能会将该请求转发给另一台计算机。如果对象在不再需要访问该文件时不通知操作系统,则服务器可能会使宇宙中的所有其他人永远无法访问该文件。
为了尽量减少实体在代表被放弃的对象上永久执行操作所带来的问题,.net提供了一种方式,即对象可以要求在被放弃时得到通知。如果覆盖Object.Finalize()方法的对象被放弃,那么.net通常会调用该对象的Finalize()方法的覆盖。这种方法有点行之有效,但几乎永远不应该依赖它。设计一个类使Finalize()总是做对且从不做错是非常困难的。除此之外,如果不小心,.net可能会在对象与外部实体交互时确定该对象将被放弃并调用Finalize()。这在正确调用对象的Dispose代码中永远不会发生,但可能会在依赖于Finalize()的代码中发生。

1
如果你的意思是将值“Nothing”赋给对象,如下所示:
Set Mycmd = Nothing

这实际上并没有发出任何信号,表明对象已准备好进行垃圾回收,或释放对象使用的资源。

在VB6中,将对象设置为等于Nothing是释放对象资源的正确方法,但现在调用Dispose方法是正确的。如果对象不实现IDisposable,则可以简单地将它们留下。

垃圾回收将在自己的时间内发生(即使没有调用.Dispose())。


好的,谢谢您先生。还有一个问题,我创建了一个 DLL 文件,该文件具有多个函数。我在我的项目中使用了该 DLL,我创建了一个全局对象,例如公共函数作为新的 mycontrols.functions。我在所有表单中都使用了 fun 变量。这是正确的方式吗? - Arul

0

没有任何 .nothing() 方法来释放对象资源。您可以使用 dispose 和 nothing 来释放对象资源。但是,当实现 IDisposable 接口时,应使用 dispose。如果您正在使用自定义类,则 .net 内置对象已经具有此功能,但仅在您的对象具有引用时才有效,否则将会出错。您可以使用

command=nothing

对于所有对象,无论是 .net 框架还是自定义对象。两者都可以释放对象。


1
在 .Net 中,这不是正确的做法,将一个对象设置为 Nothing 并不能释放它的资源。 - David Hall
好的,谢谢您先生。还有一个问题,请问。我创建了一个 DLL 文件,该文件具有更多的功能。我在我的项目中使用了这个 DLL,我创建了一个全局对象。例如:公共函数作为 new mycontrols.functions。我在所有表单中都使用了 fun 变量。这是正确的方式吗? - Arul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接