某个方法中定义了DataSet变量,但是退出时我没有调用Dispose方法,因为我觉得没必要。我看其他人写的代码有的调用了Dispose方法,到底这样的调用是否有必要?项目经理也叫我调用

解决方案 »

  1.   

    不需要Dispose的。过程结束后会自动清除垃圾
      

  2.   

    我感觉区别就是如果你不调用Dispose,那在GC下次回收之前对象是一直存在的。
    这样多占内存但是执行顺畅而你调用了Dispose,那就是立即回收内存
    这样会节约内存,但是需要花时间来释放内存。所以如果对象较大就主动调用Dispose吧
      

  3.   

    使用
    using(DataSet ds = new DataSet())
    {}
    只要是从IDispose接口继承而来的,都可以使用using自释放机制
      

  4.   

    你的说法不对,就算你调用Dispose也不会立即进行垃圾回收,垃圾回收只会在代充满时才会回收
      

  5.   


    Dispose是释放资源
    而垃圾回收的时候会在回收对象之前调用Dispose
    所以如果你调用了Dispose就算对象不回收,那资源已经释放了,对象已经只剩个空壳子而已。就像DataSet调用了Dispose之后内存会释放掉,虽然对象还在,但是已经不占用资源了
      

  6.   

    私有对象在使用过后(你可以理解为是ds变量的作用域,比如某个if分支里头声明的对象==)会自动由GC回收,一旦调用Dispose()方法,就不应该对它进行后续操作。
    如果已经确定你的DS对象在后面不会再使用到,建议显式调用
    否则直到GC觉察到该对象已不存在任何引用时才会被真正回收
      

  7.   

    dispose是提供一个由程序员显式释放非托管资源的接口(不然的话就只有等GC回收对象时和托管资源一起释放)
    你在方法中显式调用Dispose可以确保在调用Dispose时非托管资源被释放(那个DateSet对象还存在,只是里面的非托管资源被释放了)
    不调用的话就说不准什么时候被GC回收了我不是搞数据库的,不清楚DataSet里用了什么非托管资源
    对于一些不是很关键的非托管资源(也就是你也不关心它究竟什么时候被释放)可以不管Dispose
    但对于其他一些比较紧缺的非托管资源,或者涉及到独占访问之类的(比如文件句柄)你就需要显式地在不需要使用的地方调用Dispose比如你独占方式创建一个文件流
    现在你文件操作完成了,函数也退出了,但GC不会立马回收文件流对象,文件句柄也就不会被立刻释放
    那就有可能你下次再要访问这个文件时,结果那个文件还被独占着,没法访问
    这时,就需要在文件操作完后手动调用Dispose(或者close)
    上面文件流的例子只是一个大概地推测,我也不清楚FileStream内部是怎么处理的
      

  8.   

    记得有点混乱了,
    用户调用Dispose时托管资源也会顺便释放掉
    GC回收时就只释放非托管资源了
      

  9.   


    DataSet调用Dispose后内存会释放掉,真的假的?Dispose释放的是非托管的资源吧?
      

  10.   

    不是的,GC回收会调用Dispose,如果手动调用Dispose只会让GC回收时不再调用Dispose
      

  11.   

    如果手动调用Dispose只会让GC回收时不再调用Dispose
    ----------------
    你听谁说的?调用Dispose的目的就是立即释放非托管资源,这个和GC无关,GC是不管理非托管内存的...如果不显式调用Dispose方法,直到GC回收垃圾对象调用其析构函数时才释放其占用的资源,两者区别是很大的...和C++不同,GC调用析构函数的时间无法预料,所以使用非托管资源的对象才需要IDisposable接口,才需要显式调用Dispose方法...而托管资源是不用管的,析构函数也没用...ps:所谓资源,当然包括内存...非托管资源也当然包括非托管内存...
      

  12.   


    你这边说就像DataSet调用了Dispose之后内存会释放掉,这个不对的吧,内存应该还没释放
      

  13.   


    我这边说错了,手动调用Dispose后,GC回收时就不会调用用Finalize,可以直接回收,避免放入终结队列,等待下一次回收
      

  14.   

    就算调用了Dispose也不会立即回收内存的吧
      

  15.   

    只要实现了IDisposable接口的类的实例,使用之后最好都显式释放掉,或者用Using结构来调用。这是一种约定
      

  16.   

    GC进行的垃圾回收主要是回收托管堆中的资源。在托管堆中,如果一个引用类型的实例已经不再被函数栈中的引用指针引用,那么在第0代充满时,GC会自动回收0代资源,并检查1代和2代的资源是否接近饱和
    而很多继承IDisposeable的类型,不仅含有托管资源,还含有非托管资源。由于GC只负责托管堆的资源回收,所以对于非托管资源,GC根本不会理睬。这也就是要调用Dispose()来显示释放非托管资源的原因。在Dispose()中,往往是负责对非托管资源的释放,对托管资源,只是设置null,然后等待GC来释放。
    如果不显示调用Dispose()的话,当类型生命周期结束,会调用析构函数来释放资源。析构函数只会释放非托管资源,基本不会理会托管资源(因为调用析构函数的时候,类中的托管资源可能早就已经被GC回收了)。
    所以对于是否要显示调用Dispose(),主要是看对应类型是否真正有需要被释放的非托管资源,如果没有非托管资源,完全可以不用调用Dispose(),而交给GC来回收。
    比如SQLCommand类,虽然有Dispose()方法,但一般根本不需要调用。而与之对应的OleDBCommand,则最好根据连接的Ole实际情况,调用Dispose()来释放非托管资源。
      

  17.   

    主动调用Dispose比较好如果你不调用Dispose,这个对象会由垃圾回收器处理机制自行销毁,但可能不是及时的。不用了就主动释放,既节省了资源,又减轻了垃圾回收器的负担。
      

  18.   

    这看上去还不错,DataSet没必要Dispose吧
      

  19.   

    像文件,数据库之类的确实要显示调用Dispose,可是DataSet真是觉得没必要,Dispose了又能怎样,又不能马上释放内存
      

  20.   

    至少我到目前做的所有项目的CodingStandard中,都没有要求DataSet要掉用Dispose()其实如果没有非托管资源的话,调不调用Dispose()都一样,调用Dispose()最多也只是将托管资源的引用设为null,根本不会压缩托管堆,也就是说根本不会销毁对象。
    只有在GC进行完垃圾回收后,才会压缩托管堆,如果GC没有进行垃圾回收,托管堆根本不会被压缩。