关于销毁(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 DisposeDispose 方法的重写,如果执行到了这里就说明该类将被销毁,那么事实上对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,不过你可以写在以前的查询语句中。


Contributors: FHL