关于局部变量DataSet对象是否有必要调用Dispose方法? 某个方法中定义了DataSet变量,但是退出时我没有调用Dispose方法,因为我觉得没必要。我看其他人写的代码有的调用了Dispose方法,到底这样的调用是否有必要?项目经理也叫我调用 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不需要Dispose的。过程结束后会自动清除垃圾 我感觉区别就是如果你不调用Dispose,那在GC下次回收之前对象是一直存在的。这样多占内存但是执行顺畅而你调用了Dispose,那就是立即回收内存这样会节约内存,但是需要花时间来释放内存。所以如果对象较大就主动调用Dispose吧 使用using(DataSet ds = new DataSet()){}只要是从IDispose接口继承而来的,都可以使用using自释放机制 你的说法不对,就算你调用Dispose也不会立即进行垃圾回收,垃圾回收只会在代充满时才会回收 Dispose是释放资源而垃圾回收的时候会在回收对象之前调用Dispose所以如果你调用了Dispose就算对象不回收,那资源已经释放了,对象已经只剩个空壳子而已。就像DataSet调用了Dispose之后内存会释放掉,虽然对象还在,但是已经不占用资源了 私有对象在使用过后(你可以理解为是ds变量的作用域,比如某个if分支里头声明的对象==)会自动由GC回收,一旦调用Dispose()方法,就不应该对它进行后续操作。如果已经确定你的DS对象在后面不会再使用到,建议显式调用否则直到GC觉察到该对象已不存在任何引用时才会被真正回收 dispose是提供一个由程序员显式释放非托管资源的接口(不然的话就只有等GC回收对象时和托管资源一起释放)你在方法中显式调用Dispose可以确保在调用Dispose时非托管资源被释放(那个DateSet对象还存在,只是里面的非托管资源被释放了)不调用的话就说不准什么时候被GC回收了我不是搞数据库的,不清楚DataSet里用了什么非托管资源对于一些不是很关键的非托管资源(也就是你也不关心它究竟什么时候被释放)可以不管Dispose但对于其他一些比较紧缺的非托管资源,或者涉及到独占访问之类的(比如文件句柄)你就需要显式地在不需要使用的地方调用Dispose比如你独占方式创建一个文件流现在你文件操作完成了,函数也退出了,但GC不会立马回收文件流对象,文件句柄也就不会被立刻释放那就有可能你下次再要访问这个文件时,结果那个文件还被独占着,没法访问这时,就需要在文件操作完后手动调用Dispose(或者close)上面文件流的例子只是一个大概地推测,我也不清楚FileStream内部是怎么处理的 记得有点混乱了,用户调用Dispose时托管资源也会顺便释放掉GC回收时就只释放非托管资源了 DataSet调用Dispose后内存会释放掉,真的假的?Dispose释放的是非托管的资源吧? 不是的,GC回收会调用Dispose,如果手动调用Dispose只会让GC回收时不再调用Dispose 如果手动调用Dispose只会让GC回收时不再调用Dispose----------------你听谁说的?调用Dispose的目的就是立即释放非托管资源,这个和GC无关,GC是不管理非托管内存的...如果不显式调用Dispose方法,直到GC回收垃圾对象调用其析构函数时才释放其占用的资源,两者区别是很大的...和C++不同,GC调用析构函数的时间无法预料,所以使用非托管资源的对象才需要IDisposable接口,才需要显式调用Dispose方法...而托管资源是不用管的,析构函数也没用...ps:所谓资源,当然包括内存...非托管资源也当然包括非托管内存... 你这边说就像DataSet调用了Dispose之后内存会释放掉,这个不对的吧,内存应该还没释放 我这边说错了,手动调用Dispose后,GC回收时就不会调用用Finalize,可以直接回收,避免放入终结队列,等待下一次回收 就算调用了Dispose也不会立即回收内存的吧 只要实现了IDisposable接口的类的实例,使用之后最好都显式释放掉,或者用Using结构来调用。这是一种约定 GC进行的垃圾回收主要是回收托管堆中的资源。在托管堆中,如果一个引用类型的实例已经不再被函数栈中的引用指针引用,那么在第0代充满时,GC会自动回收0代资源,并检查1代和2代的资源是否接近饱和而很多继承IDisposeable的类型,不仅含有托管资源,还含有非托管资源。由于GC只负责托管堆的资源回收,所以对于非托管资源,GC根本不会理睬。这也就是要调用Dispose()来显示释放非托管资源的原因。在Dispose()中,往往是负责对非托管资源的释放,对托管资源,只是设置null,然后等待GC来释放。如果不显示调用Dispose()的话,当类型生命周期结束,会调用析构函数来释放资源。析构函数只会释放非托管资源,基本不会理会托管资源(因为调用析构函数的时候,类中的托管资源可能早就已经被GC回收了)。所以对于是否要显示调用Dispose(),主要是看对应类型是否真正有需要被释放的非托管资源,如果没有非托管资源,完全可以不用调用Dispose(),而交给GC来回收。比如SQLCommand类,虽然有Dispose()方法,但一般根本不需要调用。而与之对应的OleDBCommand,则最好根据连接的Ole实际情况,调用Dispose()来释放非托管资源。 主动调用Dispose比较好如果你不调用Dispose,这个对象会由垃圾回收器处理机制自行销毁,但可能不是及时的。不用了就主动释放,既节省了资源,又减轻了垃圾回收器的负担。 这看上去还不错,DataSet没必要Dispose吧 像文件,数据库之类的确实要显示调用Dispose,可是DataSet真是觉得没必要,Dispose了又能怎样,又不能马上释放内存 至少我到目前做的所有项目的CodingStandard中,都没有要求DataSet要掉用Dispose()其实如果没有非托管资源的话,调不调用Dispose()都一样,调用Dispose()最多也只是将托管资源的引用设为null,根本不会压缩托管堆,也就是说根本不会销毁对象。只有在GC进行完垃圾回收后,才会压缩托管堆,如果GC没有进行垃圾回收,托管堆根本不会被压缩。 如何把js用正则转成HTML代码 c#数据库编程中,是采用OLE DB还是其他方式更好? C# 控件背景色 我是不是不应该来大连 有点难度的搜索,请帮忙 C#制作文本文件 下面的c++代码如何转为c# 如何保护自已的DLL 用vs.net开发的web项目怎么移植到别的机器上去做啊 win10的出现,能否给C#辉煌 老问题,新问。C#类库不显示智能提示 字符串转换为时间格式
这样多占内存但是执行顺畅而你调用了Dispose,那就是立即回收内存
这样会节约内存,但是需要花时间来释放内存。所以如果对象较大就主动调用Dispose吧
using(DataSet ds = new DataSet())
{}
只要是从IDispose接口继承而来的,都可以使用using自释放机制
Dispose是释放资源
而垃圾回收的时候会在回收对象之前调用Dispose
所以如果你调用了Dispose就算对象不回收,那资源已经释放了,对象已经只剩个空壳子而已。就像DataSet调用了Dispose之后内存会释放掉,虽然对象还在,但是已经不占用资源了
如果已经确定你的DS对象在后面不会再使用到,建议显式调用
否则直到GC觉察到该对象已不存在任何引用时才会被真正回收
你在方法中显式调用Dispose可以确保在调用Dispose时非托管资源被释放(那个DateSet对象还存在,只是里面的非托管资源被释放了)
不调用的话就说不准什么时候被GC回收了我不是搞数据库的,不清楚DataSet里用了什么非托管资源
对于一些不是很关键的非托管资源(也就是你也不关心它究竟什么时候被释放)可以不管Dispose
但对于其他一些比较紧缺的非托管资源,或者涉及到独占访问之类的(比如文件句柄)你就需要显式地在不需要使用的地方调用Dispose比如你独占方式创建一个文件流
现在你文件操作完成了,函数也退出了,但GC不会立马回收文件流对象,文件句柄也就不会被立刻释放
那就有可能你下次再要访问这个文件时,结果那个文件还被独占着,没法访问
这时,就需要在文件操作完后手动调用Dispose(或者close)
上面文件流的例子只是一个大概地推测,我也不清楚FileStream内部是怎么处理的
用户调用Dispose时托管资源也会顺便释放掉
GC回收时就只释放非托管资源了
DataSet调用Dispose后内存会释放掉,真的假的?Dispose释放的是非托管的资源吧?
----------------
你听谁说的?调用Dispose的目的就是立即释放非托管资源,这个和GC无关,GC是不管理非托管内存的...如果不显式调用Dispose方法,直到GC回收垃圾对象调用其析构函数时才释放其占用的资源,两者区别是很大的...和C++不同,GC调用析构函数的时间无法预料,所以使用非托管资源的对象才需要IDisposable接口,才需要显式调用Dispose方法...而托管资源是不用管的,析构函数也没用...ps:所谓资源,当然包括内存...非托管资源也当然包括非托管内存...
你这边说就像DataSet调用了Dispose之后内存会释放掉,这个不对的吧,内存应该还没释放
我这边说错了,手动调用Dispose后,GC回收时就不会调用用Finalize,可以直接回收,避免放入终结队列,等待下一次回收
而很多继承IDisposeable的类型,不仅含有托管资源,还含有非托管资源。由于GC只负责托管堆的资源回收,所以对于非托管资源,GC根本不会理睬。这也就是要调用Dispose()来显示释放非托管资源的原因。在Dispose()中,往往是负责对非托管资源的释放,对托管资源,只是设置null,然后等待GC来释放。
如果不显示调用Dispose()的话,当类型生命周期结束,会调用析构函数来释放资源。析构函数只会释放非托管资源,基本不会理会托管资源(因为调用析构函数的时候,类中的托管资源可能早就已经被GC回收了)。
所以对于是否要显示调用Dispose(),主要是看对应类型是否真正有需要被释放的非托管资源,如果没有非托管资源,完全可以不用调用Dispose(),而交给GC来回收。
比如SQLCommand类,虽然有Dispose()方法,但一般根本不需要调用。而与之对应的OleDBCommand,则最好根据连接的Ole实际情况,调用Dispose()来释放非托管资源。
只有在GC进行完垃圾回收后,才会压缩托管堆,如果GC没有进行垃圾回收,托管堆根本不会被压缩。