2011-03-01 79 views
2
**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())的对象。我这里可以使用无(Mycmd =什么?这是最好的?处置之间的区别没有

请帮帮我的先生,

通过

了Arul。

+0

OdbcCommand对象上是否真的有.Nothing()方法,或者您将对象设置为Nothing? – 2011-03-01 06:54:57

+1

这里有一些关于你的问题的很好的讨论:http://bytes.com/topic/net/answers/726065-set-object-nothing-do-you-still-do-vb-net – 2011-03-01 07:04:40

+0

**相关:* * [在.NET中使用后将对象设置为空/无](http://stackoverflow.com/q/2785/1497596) – DavidRR 2014-05-22 14:17:04

回答

0

有任何.nothing不是()方法释放对象资源,你可以使用dispose和nothing来释放对象资源,但是当IDisposable接口被实现的时候会使用dispose,如果你使用的是自定义的类,.net内置的对象已经具有这个功能,但是如果你的对象是否则会引起错误。您可以使用

command = nothing

对于所有对象.net框架或自定义。两个释放对象。

+1

这在.Net中不正确,将对象设置为Nothing并不释放其资源。 – 2011-03-01 07:03:55

+0

好的,谢谢你,先生。另一位怀疑的先生。我创建一个Dll文件。该文件具有更多功能。我在我的项目中使用该DLL。我为Globaly创建了一个对象。 Ex public fun as new mycontrols.functions。我在所有形式中使用有趣的变量。这是否正确。 – Arul 2011-03-01 07:12:42

1

如果你的意思是分配的值Nothing对象如下:

Set Mycmd = Nothing 

这实际上并不在信令对象准备进行垃圾回收,或释放对象的使用资源方面做任何事情。

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

垃圾收集将在其自己的时间发生(甚至可能没有调用.Dispose())。

+0

好的,谢谢你,先生。另一位怀疑的先生。我创建一个Dll文件。该文件具有更多功能。我在我的项目中使用该DLL。我为Globaly创建了一个对象。 Ex public fun as new mycontrols.functions。我在所有形式中使用有趣的变量。这是否正确。 – Arul 2011-03-01 07:10:44

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

该命令存储由新Odbc.OdbcCommand(pQueryString,的myconn)创建成Mycmd对象的参考,即Mycmd将基本上具有与新创建的对象的地址。

现在,当你做

Mycmd.Dispose() 

则表示将使用新创建的对象是在分配给该对象的空间垃圾收集过程中被释放。

但是当你做

Set Mycmd = Nothing 

那么它只是删除Mycmd新创建的对象的引用,它不会将其标记为垃圾收集。

+0

我完全理解。现在只有我清除了怀疑。先生非常感谢您。 – Arul 2011-03-01 11:56:26

+0

看看这个:http://msdn.microsoft.com/en-us/library/hks5e2k6.aspx – Armand 2014-02-21 18:28:27

3

很多时候,.net对象会要求其他实体(它们可能甚至可能不在同一台计算机上)代表它们“做某些事情”(*),这些实体将继续这样做,除非或直到它们被告知停止。这些对象应该实现IDisposable,并且它们的IDisposable.Dispose例程应该通知任何和所有代表它们做事的实体,停止这样做。如果在不首先调用Dispose对象的情况下所有对IDisposable对象的引用都将消失,则其他一些实体可能会永远无用地继续代替早已不复存在的对象进行某些操作。

(*)“做某事”可以是任何事情,包括阻止其他请求做某事。例如,对象可能会要求操作系统独占访问文件,操作系统可能会将该请求转发给另一台计算机。如果对象不再需要访问该文件时通知操作系统,服务器可能会将Universe中的所有其他人无限期地锁定在文件外。

为了最大限度地减少实体代表被遗弃物体的问题,.net提供了一种方法,通过这种方式,物体在被放弃时可以要求通知他们。如果一个覆盖Object.Finalize()的对象被放弃,那么.net通常会调用该对象对Finalize()方法的覆盖。大多数情况下,这种方法很有效,但几乎不应该依赖它。设计一个类非常困难,以至于Finalize()将始终做正确的事情,永远不会做错误的事情。除此之外,如果一个人不小心,那么.net可能会调用Finalize()来确定它将被放弃的对象,即使该对象正在与外部实体交互。这绝不会在代码中正确调用对象上的Dispose,但可能发生在依赖于Finalize()的代码中。