关于销毁(Dispose)的问题--简单
主 题: 关于销毁(Dispose)的问题--简单
作 者: NewSun99 (旭日)
等 级:
信 誉 值: 100
所属论坛: .NET技术 C#
问题点数: 100
回复次数: 23
发表时间: 2003-12-2 16:17:49
我在Form里: private DataSet oraDataSet = new DataSet();
在Dispose
我是这样写的:
protected override void Dispose(bool disposing)
{
if(disposing)
{
if(components != null)
{
components.Dispose();
for(i = 0,iCount = oraDataSet.Tables.Count;i < iCount;i ++)
{
oraDataSet.Tables[i].Clear();
oraDataSet.Tables[i].Dispose();
}
oraDataSet.Dispose();
oraCommand.Dispose();
}
}
base.Dispose( disposing );
}
我想问一下:直接写oraDataSet.Dispose()
,而不做前面的循环是否一样的效果,这样是不是多余?
回复人: gabriel1(威) ( 四级(中级)) 信誉:100 2003-12-2 16:20:54 得分:0
基本上是释放窗体资源的意思,不过dataset还是要等它垃圾回收滴。
从程序严密的角度来考虑,一个open就应该对应一个close,习惯。
回复人: lbx1979(Love Arsenal) ( 一星(中级)) 信誉:101 2003-12-2 16:21:44 得分:0
我觉得不用循环了
回复人: brightheroes(闭关) ( 一星(中级)) 信誉:100 2003-12-2 16:25:29 得分:0
同上
回复人: NewSun99(旭日) ( 一级(初级)) 信誉:100 2003-12-2 16:34:44 得分:0
我还想问一下,就是在Dispose中,是否需要将自己在From中new的对象手工Dispose?
回复人: lbx1979(Love Arsenal) ( 一星(中级)) 信誉:101 2003-12-02 16:41:00 得分:0
不用手工dispose
回复人: qimini(循序渐进) ( 一星(中级)) 信誉:106 2003-12-02 16:50:00 得分:0
不用释放
回复人: NewSun99(旭日) ( 一级(初级)) 信誉:100 2003-12-02 16:50:00 得分:0
问题1:直接写oraDataSet.Dispose(),而不做前面的循环是否一样的效果,这样是不是多余?
问题2:在Dispose中,是否需要将自己在From中new的对象手工Dispose?
问题3:在DataTable中,是否能够Group By?
回复人: ldy(罗大佑) ( 四级(中级)) 信誉:100 2003-12-02 16:58:00 得分:0
学习
回复人: wangweixing2000(星) ( 二级(初级)) 信誉:100 2003-12-02 17:12:00 得分:0
不用释放
回复人: Edelweissobject(青山绿水) ( 二级(初级)) 信誉:101 2003-12-02 17:29:00 得分:0
楼主,1、不用循环效果一样。
2、.Net框架有自动回收内存的功能,并不用每个new对象手动Dispose。
3、DataTable不支持Group by,不过你可以写在以前的查询语句中。
回复人: NewSun99(旭日) ( 一级(初级)) 信誉:100 2003-12-02 21:01:00 得分:0
还有什么回答啊
回复人: ArLi2003(阿利 大家帮我找工作呀) ( 两星(中级)) 信誉:101 2003-12-02 21:33:00 得分:0
Dispose 是自动的,为什么说是自动的,这是必须要先了解对象作用域才可以说“GC 会帮忙”的
Dispose 是自动是源自于对象的废弃,比如
private void o(){
private string s = "1";
}
当 o 这个方法结束时,s 这个内存堆会被废弃或者被重用,如果废弃状态在GC 的next timer 到时(可以使用Process Explorer 新版查到 timer),也是一样会被free 掉,在server 级别(win2003)中包括服务、DLL 都会被定时回收的
所以你的oraDataSet 是否必须要 Dispose,这就取决于它的作用域或父容器(比如当前类、继承的方法、受引用体等)是否已经失效或者已经被销毁
另外一种情况在于,如果该变量作用域是“类局部”就应该在 不再使用时 进行Dispose
,这是一个好的习惯,至于是否需要循环事实上,是不必的,而且上面你的例子连Dispose 都不需要,你的 protected override void Dispose
是 Dispose
方法的重写,如果执行到了这里就说明该类将被销毁,那么事实上对oraDataSet(如果此变量作用域是当前类并且不是静态的) 进行 Dispose 是非必须的。
不过,对于Dispose 我个人意见还是做在析构里比较安全些,比如
public class a{
private DataSet oraDataSet = new DataSet();
private void 方法1或其它代码(){ }
~a { //这就是析构,它在当前类反构造(销毁实例)时执行
oraDataSet.Dispose();
}
}
回复人: qiujoe(迷糊) ( 四级(中级)) 信誉:95 2003-12-02 22:08:00 得分:0
问题1 不需要,多余
问题2 需要,这是一个好习惯,可以在不用的时候将资源释放出来,我觉得在析构函数中做,完全取决于系统在销毁时才释放资源。感觉不能尽快释放资源,不爽:-)
问题3 不知道
回复人: Sunmast(速马) ( 五级(中级)) 信誉:100 2003-12-02 22:11:00 得分:0
但是书上说析构很浪费资源哦
.NET里面很少需要使用析构函数的...
回复人: qiujoe(迷糊) ( 四级(中级)) 信誉:95 2003-12-02 22:12:00 得分:0
补充:对于问题2 个人觉得是非常重要。对于临界资源,一定需要调用dispose(),否则不能充分利用资源
回复人: cnicq(HeIsTheOne) ( 二级(初级)) 信誉:99 2003-12-02 22:18:00 得分:0
gz
回复人: NewSun99(旭日) ( 一级(初级)) 信誉:100 2003-12-03 08:26:00 得分:0
谢谢大伙。
qiujoe(迷糊)和 ArLi2003(阿利 大家帮我找工作呀) 在观点二上有些冲突。
qiujoe(迷糊)说的临界资源是什么意思
回复人: hoyu(心茗) ( 二级(初级)) 信誉:100 2003-12-03 08:56:00 得分:0
同意 Edelweissobject(青山绿水)
1、不用循环效果一样。
2、.Net框架有自动回收内存的功能,并不用每个new对象手动Dispose。
(也可以手动释放!这样执行效率会更高一些)
3、DataTable不支持Group by,不过你可以写在以前的查询语句中。
回复人: 1000000googol(估计) ( 一级(初级)) 信誉:100 2003-12-03 08:58:00 得分:0
好象析构的时候反而不知道在什么时候析构了,所以微软也建议不要使用析构函数
回复人: myclife(反方向的钟) ( 一级(初级)) 信誉:100 2003-12-03 09:30:00 得分:0
我学习。
回复人: loulanlouzhu(桃花潭水深千尺,不及阿勇念你情) ( 五级(中级)) 信誉:91 2003-12-03 09:38:00 得分:0
2、.Net框架有自动回收内存的功能,并不用每个new对象手动Dispose。
(也可以手动释放!这样执行效率会更高一些)
-->>效率不一定会更高的!!垃圾回收器会根据应用程序的资源情况判断什么时候该回收资源!!
因为资源回收操作将耗费系统资源,如果手工回收资源的话有可能影响应用程序的性能!
===弯弯的月亮小小的船,小小的船,两头尖,我在小小的船里坐,只看见闪闪的星星蓝蓝的天.
===本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利
===我的blog:http://loulanlouzhu.blogone.net
回复人: realMAX(白色休止符) ( 五级(中级)) 信誉:100 2003-12-03 09:43:00 得分:0
不用手工Dispose,因为.net有垃圾回收机制,会自动回收的,但有手动Dispose这种习惯也没什么问题呀,看情况而用咯
回复人: lemong(風之影) ( 五级(中级)) 信誉:100 2003-12-03 09:51:00 得分:0
楼主,1、不用循环效果一样。
2、.Net框架有自动回收内存的功能,从内存管理的角度,并不用每个new对象手动Dispose;但是,从习惯上说,应该在动态对象的作用期结束后及时释放对象,一面可以及时回收内存,一面,也可以防止重复生成相同的id等其他冲突。
3、DataTable不支持Group by,不过你可以写在以前的查询语句中。