当前位置: 代码迷 >> VB Dotnet >> .NET销毁对象的一个有关问题
  详细解决方案

.NET销毁对象的一个有关问题

热度:33   发布时间:2016-04-25 02:09:59.0
.NET销毁对象的一个问题
 写了一个类cls,其中有Private mOleDbConnection As New OleDb.OleDbConnection

做了一个mOleDbConnection.open动作

然后我想在Finalize()中销毁mOleDbConnection,于是有

    Protected Overrides Sub Finalize()
        If Not mOleDbConnection Is Nothing Then     
            mOleDbConnection.Dispose()    
        End If
        MyBase.Finalize()
    End Sub

但是我每次执行的类cls=nothing时报错,“System.InvalidOperationException”类型的未经处理的异常在 System.Data.dll 中发生 

其他信息: 句柄未初始化。

VB6每次set nothing都会执行 Class_Terminate,而VB.net不会立即执行清理

那么我要怎么才能立即销毁类里面的这个模块级的mOleDbConnection?
------解决思路----------------------
Public NotInheritable Class OleDbConnection _
Inherits DbConnection _
Implements ICloneable, IDbConnection, IDisposable

OleDbConnection本身就继承了IDisposable,不需要显性的销毁,.Net自己会把它干掉的,记得关闭connection就行了。
------解决思路----------------------
在.net中,每当GC回收一个对象,必然会调用其 Dispose() 方法(如果有的话)。而释放你的对象之前,自然会去释放 mOleDbConnection。因此根本不用画蛇添足去调用 Dispose() 方法。

至于说“为什么在程序中需要调用 DbConnection 类型对象的 Dispose()方法?”,这是为了在宿主对象被销毁之前就提前、尽快地释放数据库连接,归还到连接池中,以免出现“连接池满”的异常。

而你的这段程序并没有这种需求,所以你也不需要调用 Dispose() 方法。
------解决思路----------------------
Connection 对象用 Open、Close 来控制外部资源(连接)的占用和释放,这个要显式调用。
至于对象自身的 Dispose,由 .Net 自动完成,你只需要在必要时 Set Nothing 就可以了。

由于 Set Nothing 和 Dispose 之间有延时,如果你调用了 Open 而没有调用 Close,连接在 Dispose 之前是一直开着的。
所以要显式调用 Close。
------解决思路----------------------
引用:
在.net中,每当GC回收一个对象,必然会调用其 Dispose() 方法(如果有的话)。而释放你的对象之前,自然会去释放 mOleDbConnection。因此根本不用画蛇添足去调用 Dispose() 方法。

至于说“为什么在程序中需要调用 DbConnection 类型对象的 Dispose()方法?”,这是为了在宿主对象被销毁之前就提前、尽快地释放数据库连接,归还到连接池中,以免出现“连接池满”的异常。

而你的这段程序并没有这种需求,所以你也不需要调用 Dispose() 方法。


你说的不对吧, 在.net中,每当GC回收一个对象,必然会调用其  析构函数(如果有的话), 而Dispose() 方法是手动调用的
  相关解决方案