DataSet 和 DataTable 都实现了 IDisposable,因此,按照常规的最佳实践,我应该调用它们的 Dispose() 方法。
但是,从我目前所读到的内容来看,DataSet 和 DataTable 实际上没有任何非托管资源,因此 Dispose() 实际上并没有做太多事情。
另外,我不能只使用using(DataSet myDataSet...),因为 DataSet 有一个 DataTables 集合。
using(DataSet myDataSet...)
因此,为了安全起见,我需要遍历 myDataSet.Tables,处理每个 DataTable,然后处理 DataSet。
那么,在我的所有数据集和数据表上调用 Dispose() 是否值得?
附录:
对于那些认为应该处置 DataSet 的人:通常,处置模式是使用usingor try..finally,因为您想保证 Dispose() 将被调用。
using
try..finally
然而,这对于一个集合来说变得非常难看。例如,如果对 Dispose() 的调用之一引发异常,您会怎么做?你吞下它(这是“坏的”),以便你可以继续处理下一个元素吗?
或者,您是否建议我只调用 myDataSet.Dispose(),而忘记在 myDataSet.Tables 中处理 DataTables?
这里有几个讨论解释了为什么 DataSet 不需要 Dispose。
处置还是不处置?:
DataSet 中的 Dispose 方法的存在只是因为继承的副作用——换句话说,它实际上并没有在终结中做任何有用的事情。
应该对 DataTable 和 DataSet 对象调用 Dispose 吗?包括来自 MVP 的一些解释:
system.data 命名空间 (ADONET) 不包含非托管资源。因此,只要您没有为自己添加一些特殊的东西,就不需要处理任何这些。
了解 Dispose 方法和数据集?有权威斯科特艾伦的评论:
在实践中,我们很少 Dispose 数据集,因为它提供的好处很少”
因此,共识 是目前没有充分的理由在 DataSet 上调用 Dispose。