请问此方法能够获取数据集吗?不会被Dispose()清空吧??  
 public DataSet GetTable(string sql)
  {
  SqlDataAdapter sda = new SqlDataAdapter(sql, conn);//创建数据适配器对象
  DataSet ds = new DataSet();//创建数据集
  sda.Fill(ds);//填充数据集
  ds.Dispose();
  return ds;//返回数据集
  }
我测试后为什么能返回具体的数据集呢?Dispose不是起到释放资源的吗? 
 
 

解决方案 »

  1.   

    Dispose只是告诉GC说能释放了,不是说立即就释放掉
      

  2.   

    调Dispose方法本身并不释放对象资源,对象资源只能由垃圾收集器释放,而垃圾收集器只在创建新对象时堆中资源不足才被触发,所以才会遇到好像资源没有被释放的问题。 另外无用单元收集器(GC)并不是经常运行的。它是定期运行的,根据一种复杂的测定计算机所做工作数量的算法,确定可能需要删除多少对象。GC运行时,它会浏览程序已创建的所有对象的列表,并删除可被删除的对象。 
            在以前传统的编程技术中,程序员们要负责删除他们自己的对象,并且有这样一种特权,可以告诉对象:“你,现在把自己从内存中清除出去!”有了.NET,他们就没有这种能力了,将来会在不确定的时候对对象进行删除。 
            确切地说,删除所发生的时间是不确定的,换言之,作为开发人员的你不会知道GC在什么时候会运行。这就意味着在删除对象的最后一个引用和从内存中实际删除该对象间并没有即时的联系,这就是所谓的不确定结束。
      

  3.   

    那么ds.Dispose()之后,变量还可以使用是吗?
    调用Dispose()后,当GC回收资源时,是不是就不再检查该变量是否还存在引用而是直接删除?
    如果是这样,Dispose之后,再使用此变量
    是不是会存在如下问题?比如上面语句:
    ds.Dispose();
      return ds;
    执行ds.Dispose()后立马运行GC如下:
    ds.Dispose();
    //开始运行GC
      return ds;
    那么ds就是不存在的变量了
      

  4.   

    既然你return出来了,应该还是能用的