求标准的/有效的内存释放方法
我把数据连接和释放都封装到一个类中(下面的代码有点记不清了,我是在记事本里写的,可能有错误,但能表达我的意思)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)
用完后怎么释放,不用关闭的吗?
垃圾收集器到底怎么工作?

解决方案 »

  1.   

    使用
    using()
    {
    }
    的方式
      

  2.   

    楼上是用C#的方法VB.net呢?
      

  3.   

    http://www.cnblogs.com/allancandy/archive/2006/09/30/519212.html
      

  4.   

    我指的是C#,VB下有没有我不太清楚
      

  5.   

    data2.disposeDataReader()
    data2 =nothing'最后这一行是否有必要要这样作只要调用相应的Close方法就可以了,没有必要设置为nothing垃圾收集器只是在需要的时候才进行垃圾收集的,这时候会释放对象占用的内存。
    调用Close,Dispose等方式只能是将这个对象的引用计数设为0,并不会马上被清除,只有进行垃圾收集的时候才会清除。要想清除可以 GC 类,但是频繁的进行垃圾收集会影响效率的
      

  6.   

    是不是只有用 GC 类才能真正做到立即清除内存的使用.
    其它的一切方法只是清除一个对象(类实例)的引用而已,
    比如dispose和MyBase.Finalize这样理解对不对?
      

  7.   

    using(DBConnection x=new DBConnection(....)){}的方式是主要的方法。楼主的封装背道而驰,会强化只顾使用不顾释放的那种风格。
      

  8.   

    c#的代码:
    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;
    }
    }