首页 新闻 搜索 专区 学院

DataTable会被垃圾回收么

0
悬赏园豆:10 [已解决问题] 解决于 2010-03-10 19:49

我查到了:
Classes inherited from DataSet are not finalized by the garbage collector, because the finalizer has been suppressed in DataSet.

说明DataSet不会被垃圾回收,但DataTable呢?


问题补充: 我其实要想搞明白的是: 如果使用DataSet做数据缓存,那么它就不应该被自动回收。否则我们就得使用static关键字呀!
自由飞的主页 自由飞 | 初学一级 | 园豆:174
提问于:2010-03-10 12:47
< >
分享
最佳答案
0

不会。我查阅了MSDN(该文中有   继承自 DataSet 的类不是由垃圾回收器完成的,原因是在 DataSet 中已取消终结器。派生类可以在其构造函数中调用 ReRegisterForFinalize 方法以允许垃圾回收器完成该类。),而对于DataTable无相关的说明,所以只好反编译了下DataSet和DataTable的源代码,在DataSet和DataTable的构造函数中都有同样一句话GC.SuppressFinalize(this); 这句话的意思是说 请求系统不要调用指定对象的终结器。 所以从这个层面来理解的话是不会被垃圾回收的。

个人一点愚见,如有博友有其他解释,请留言。

回复补充:如果说DataTable会被垃圾回收的话,在ADO.NET中DataSet使用DataTable对象。那么现在如果DataTable被回收了,DataSet不被回收,此时再访问DataSet的时候结果是什么??

 

我也非常想搞明白,大牛出来给解释下吧!

收获园豆:5
西越泽 | 专家六级 |园豆:10633 | 2010-03-10 13:30
回复补充:如果说DataTable会被垃圾回收的话,在ADO.NET中DataSet使用DataTable对象。那么现在如果DataTable被回收了,DataSet不被回收,此时再访问DataSet的时候结果是什么?? 我的想法,不一定正确。 如果DataTable在Dataset之中,且如果DataSet不被回收,那么DataTable也不会被回收,因为它始终被DataSet引用。
自由飞 | 园豆:174 (初学一级) | 2010-03-10 15:23
@自由飞:(⊙v⊙)嗯!我也是从这个角度理解,这种情况下那DataTable就不会被回收。
西越泽 | 园豆:10633 (专家六级) | 2010-03-10 16:28
其他回答(4)
0

SuppressFinalize似乎指的是GC不将该对象放入FinalizeQueue中,即当该对象被置为unreachable时,直接回收而不调用Finalize过程,因此Dataset和DataTable还是被回收的,只是省了回收前的Finalize调用过程

收获园豆:5
Gray Zhang | 园豆:17610 (专家六级) | 2010-03-10 13:38
0

会被回收的。

steven hu | 园豆:542 (小虾三级) | 2010-03-10 13:57
0

Dataset不会被回收,原因是:

继承自 DataSet 的类不是由垃圾回收器完成的,原因是在 DataSet 中已取消终结器。派生类可以在其构造函数中调用 ReRegisterForFinalize 方法以允许垃圾回收器完成该类。

DataTable能被回收: 因为他并没有像Dataset那样会取消终结器, 也不需要调用ReRegisterForFinalize.

风浪 | 园豆:2866 (老鸟四级) | 2010-03-10 14:14
0

msdn的解释:

继承自 DataSet 的类不是由垃圾回收器完成的,原因是在 DataSet 中已取消终结器。派生类可以在其构造函数中调用 ReRegisterForFinalize 方法以允许垃圾回收器完成该类。

datatable 不知道 关注

邢少 | 园豆:10926 (专家六级) | 2010-03-10 14:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册