求标准的/有效的内存释放方法
我把数据连接和释放都封装到一个类中(下面的代码有点记不清了,我是在记事本里写的,可能有错误,但能表达我的意思)Public Class myClassData
Private Vi as SqlConnection
Public Property proConn() As SqlConnection
Get
Vi =proConn
End Get
Set (Vi as SqlConnection)
connectionString=Vi
End set
End Property Public sub openDataReader()
Dim connection As New SqlConnection(connectionString)
Dim command As New SqlCommand("GetDepartments", connection)
command.CommandType = CommandType.StoredProcedure
connection.Open()
command.ExecuteReader(CommandBehavior.CloseConnection)
proConn=connection
connection.Close()'''关闭后是否清除了对象? connection=nothing'''问题在这里,这两句是否必要和有效??
command=nothing''' ??
End sub Public sub disposeDataReader()
proConn.close()
proConn.dispose()'''''''通过跟踪发现,这一句好象并不能清除proConn的引用
proConn =nothing''''''' 只有这一句才可行,为什么?
MyBase.Finalize() '''' 这一句用不用加上?(如果加上我可不可以把下面重载的Finalize方法删掉)
End sub
[这个限定关键字我忘了]sub [这有个重载关键字我也忘了] Finalize()
MyBase.Finalize()
end sub
End Class
我在一个按扭事件里调用这个类
dim new data2 as new myClassData
.....
data2.disposeDataReader()
data2 =nothing'最后这一行是否有必要要这样作还有一个Dim MyDataAdapter As New SqlDataAdapter(MyCommand)
用完后怎么释放,不用关闭的吗?
垃圾收集器到底怎么工作?
我把数据连接和释放都封装到一个类中(下面的代码有点记不清了,我是在记事本里写的,可能有错误,但能表达我的意思)Public Class myClassData
Private Vi as SqlConnection
Public Property proConn() As SqlConnection
Get
Vi =proConn
End Get
Set (Vi as SqlConnection)
connectionString=Vi
End set
End Property Public sub openDataReader()
Dim connection As New SqlConnection(connectionString)
Dim command As New SqlCommand("GetDepartments", connection)
command.CommandType = CommandType.StoredProcedure
connection.Open()
command.ExecuteReader(CommandBehavior.CloseConnection)
proConn=connection
connection.Close()'''关闭后是否清除了对象? connection=nothing'''问题在这里,这两句是否必要和有效??
command=nothing''' ??
End sub Public sub disposeDataReader()
proConn.close()
proConn.dispose()'''''''通过跟踪发现,这一句好象并不能清除proConn的引用
proConn =nothing''''''' 只有这一句才可行,为什么?
MyBase.Finalize() '''' 这一句用不用加上?(如果加上我可不可以把下面重载的Finalize方法删掉)
End sub
[这个限定关键字我忘了]sub [这有个重载关键字我也忘了] Finalize()
MyBase.Finalize()
end sub
End Class
我在一个按扭事件里调用这个类
dim new data2 as new myClassData
.....
data2.disposeDataReader()
data2 =nothing'最后这一行是否有必要要这样作还有一个Dim MyDataAdapter As New SqlDataAdapter(MyCommand)
用完后怎么释放,不用关闭的吗?
垃圾收集器到底怎么工作?
using()
{
}
的方式
data2 =nothing'最后这一行是否有必要要这样作只要调用相应的Close方法就可以了,没有必要设置为nothing垃圾收集器只是在需要的时候才进行垃圾收集的,这时候会释放对象占用的内存。
调用Close,Dispose等方式只能是将这个对象的引用计数设为0,并不会马上被清除,只有进行垃圾收集的时候才会清除。要想清除可以 GC 类,但是频繁的进行垃圾收集会影响效率的
其它的一切方法只是清除一个对象(类实例)的引用而已,
比如dispose和MyBase.Finalize这样理解对不对?
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(true);
}
protected virtual void Dispose(bool disposing)
{
if (! disposing)
return; if (dsCommand != null)
{
if(dsCommand.SelectCommand != null)
{
if( dsCommand.SelectCommand.Connection != null )
{
dsCommand.SelectCommand.Connection.Dispose();
}
dsCommand.SelectCommand.Dispose();
}
dsCommand.Dispose();
dsCommand = null;
}
}