日期:2014-05-17  浏览次数:20711 次

没用到非托管资源,DataSet却要实现IDispose接口,这是为何!
一直觉得DataSet没有用到非托管的资源,可是奇怪为什么却实现了IDispose接口,这样的实现
毫无意义,反而有可能增加在内存中的暂留时间!!

------解决方案--------------------
DataSet要支持序列化,所以继承于MarshalByValueComponent
而MarshalByValueComponent需要dispose
------解决方案--------------------
说什么“IDisposable接口是用来释放非托管资源的内存”的,基本上都是在瞎说,绝无直接的根据。根本不是为了这个目的。

如果一个托管对象,你需要用代码提前调用其Close之类的方法(而不是等到GC清理它的时候自动调用),那么它通常就会有这个接口。

例如需要及时向数据库连接池归还连接对象、需要及时将加锁的缓冲数据去除独占、需要及时关闭正在访问的文件、需要及时给对方发送“网络关闭”消息、需要及时通知性能分析机制以便更准确地统计时间、当系统及其容易崩溃时需要及时保存当时的运行状态、需要让系统界面及时地画上一个通知界面,等等。这些基本上都是业务逻辑需要,只有极其个别的东西才是涉及到必须“释放非托管资源”。

看不到业务逻辑需要 IDisposable 接口,就好像只能看到“c这一片叶子”而看不到“c#这一片树林”一样。
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

其实还有很多类型实现了IDisposable只是为了可以使用using语法

你这个回答,也太搞了吧,哪有这样的可能,实现Dispose可是有代价的,难道微软只是为了又这个语法去实现Dispose, 你觉得这样有意义吗,
using的语法,因为Dispose的实现,才产生出来的,这样为了防止你万一忘记去调用Dispse,那么有了这个语法,最后编译好的代码,就默认给你调用Dispose



实现IDisposable会有什么代价??

你不知道实现该接口,是需要两次垃圾回收才有可能清除内存吗?


那是你自己设想的吧,有什么微软官方的根据吗?

我靠,大哥,我估计你是没看过CLR这本书,这里面讲的很清楚,你回头去看看。


GC只会调用析构函数,不会调用Dispose,为什么会有什么两次回收?