在许多情况下,在处理不同类型的数据对象时,处置它们以确保它们不会打开数据库连接非常重要。但是,表适配器似乎不容易受到此问题的影响,因为它们是基于断开连接的数据原则构建的。我的印象是,在原子填充或更新方法完成后,表适配器将始终关闭它的连接,即使存在异常。这是对的吗?
另一方面,表适配器确实实现了IDisposable,因此在某些时候必须有一些非托管资源来清理,对吧?或者这只是仪式,以便人们可以写:
using(var a = new MyTableTableAdapter())
{
a.Fill(ds.MyTable);
}
而不必考虑这个话题?
答案 0 :(得分:3)
如果它实现了IDisposable,它当前拥有处置或将来可能的资源。如果它是一次性的,你应该处理它。你不能理解它的内部结构 - 只有理解合同并尊重它。通常情况下,人们不会在仪式之外做事 - “使用”是很酷的语法糖,但不够酷,不能开始在没有资源处理的类周围洒下IDispos :) :( / p>
此外,IDisposable并不一定意味着“非托管”资源。这意味着有些资源(如文件句柄,网络连接等)不是垃圾收集的对象(内存)。区别在于清理未收集的东西 - 而不是未管理的东西。 通常这些资源很多都是由非托管操作系统资源支持的。
编辑:
例如,假设我创建了一个完全托管的对象,可以根据需要从池(缓存)中检索其他一些对象,当您使用它时,我希望它将这些对象放回到共享池中(不是释放 - 显式调用向池中添加内容。此处没有任何操作,但我可以根据需要从池中提取对象,并且可以将它们放回(Pool.Add)以供其他人使用。消费者只需“使用” “我的目标,并知道它会在处理时清理。显然处置是必要的,因为我们不应该等待最终确定(它可能发生在以后或根本不发生) -