没用到非托管资源,DataSet却要实现IDispose接口,这是为何!
一直觉得DataSet没有用到非托管的资源,可是奇怪为什么却实现了IDispose接口,这样的实现
毫无意义,反而有可能增加在内存中的暂留时间!!
------解决方案--------------------DataSet要支持序列化,所以继承于MarshalByValueComponent
而MarshalByValueComponent需要dispose
------解决方案--------------------说什么“IDisposable接口是用来释放非托管资源的内存”的,基本上都是在瞎说,绝无直接的根据。根本不是为了这个目的。
如果一个托管对象,你需要用代码提前调用其Close之类的方法(而不是等到GC清理它的时候自动调用),那么它通常就会有这个接口。
例如需要及时向数据库连接池归还连接对象、需要及时将加锁的缓冲数据去除独占、需要及时关闭正在访问的文件、需要及时给对方发送“网络关闭”消息、需要及时通知性能分析机制以便更准确地统计时间、当系统及其容易崩溃时需要及时保存当时的运行状态、需要让系统界面及时地画上一个通知界面,等等。这些基本上都是业务逻辑需要,只有极其个别的东西才是涉及到必须“释放非托管资源”。
看不到业务逻辑需要 IDisposable 接口,就好像只能看到“c这一片叶子”而看不到“c#这一片树林”一样。
------解决方案--------------------
GC只会调用析构函数,不会调用Dispose,为什么会有什么两次回收?