在许多情况下,当使用不同类型的数据对象时,处理它们以确保它们不会使数据库连接保持打开状态非常重要。然而,表适配器似乎不容易受到这个问题的影响,因为它们是基于断开数据的原则构建的。我的印象是,即使存在异常,表适配器也始终会在原子 Fill 或 Update 方法完成后关闭其连接。这是正确的吗?
另一方面,表适配器确实实现了 IDisposable,因此必须在某个时刻清理一些非托管资源,对吧?或者这只是一个仪式,以便人们可以写:
using(var a = new MyTableTableAdapter())
{
a.Fill(ds.MyTable);
}
并且不必考虑这个话题?
最佳答案
如果它实现了 IDisposable,它要么当前拥有要处置的资源,要么将来可能会处置。如果是一次性的,则应将其丢弃。你不需要了解它的内部结构,而只是了解它的契约(Contract)并遵守它。通常,人们不会出于仪式而做事 - “使用”是很酷的语法糖,但还不够酷,不足以开始在没有资源可处置的类周围散布 IDisposable :)
此外,IDisposable 并不一定意味着“非托管”资源。这意味着有些资源(如文件句柄、网络连接等)不是垃圾收集的对象(内存)。区别在于清理未收集的内容,而不是未管理的内容。 碰巧这些资源中的许多资源通常都是由非托管操作系统资源支持的。
编辑:
例如,假设我创建了一个完全托管的对象,该对象按需从池(缓存)中检索一些其他对象,当您使用完它时,我希望它将这些对象放回到共享池中(而不是freed - 显式调用以将某些内容添加到池中。这里没有任何不受管理的内容,但我可以根据需要从池中提取对象,并在处置时将它们放回(Pool.Add)供其他人使用。消费者只需“使用“我的对象并知道它在处置时会清理。需要显式处置,因为我们不应该等待最终确定(它可能会稍后发生或根本不会发生) -关于.net - 有什么理由要丢弃 table 适配器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9204319/