DataSet和DataTable都实现了IDisposable,因此,根据传统的最佳实践,我应该调用它们的Dispose()方法。

然而,从我目前所读到的内容来看,DataSet和DataTable实际上没有任何非托管资源,因此Dispose()实际上并没有做太多工作。

另外,我不能只使用using(DataSet myDataSet…),因为DataSet有一个数据表的集合。

因此,为了安全起见,我需要遍历myDataSet。表,释放每个数据表,然后释放数据集。

那么,对我所有的数据集和数据表调用Dispose()是否值得呢?

附录:

对于那些认为数据集应该被处理的人: 一般来说,处理的模式是use using或try..最后,因为您希望保证Dispose()将被调用。

然而,对于集合来说,这很快就会变得很糟糕。例如,如果对Dispose()的调用之一抛出异常,该怎么办?是否吞下它(这是“坏的”)以便继续处理下一个元素?

或者,您是否建议我只调用myDataSet.Dispose(),而忘记在myDataSet.Tables中处理数据表?


当前回答

这里有几个讨论,解释了为什么Dispose对于DataSet不是必要的。

处理还是不处理?

DataSet中的Dispose方法存在只是因为继承的副作用——换句话说,它在终结中实际上没有做任何有用的事情。

应该在数据表和数据集对象上调用Dispose吗?其中包括一位最有价值球员的解释:

这个系统。数据命名空间(ADONET)不包含 非托管资源。因此,没有必要处理任何这些作为 只要你没有给自己加上什么特别的东西。

了解Dispose方法和数据集?有来自权威斯科特·艾伦的评论:

在实践中,我们很少处理数据集,因为它没有什么好处。”

所以,共识是,目前没有好的理由调用Dispose在一个数据集上。

其他回答

如果您的意图或这个问题的上下文实际上是垃圾收集,那么您可以显式地将数据集和数据表设置为null,或者使用关键字using并让它们超出范围。Dispose并不像Tetraneutron之前说的那样。GC将收集不再引用的数据集对象以及超出范围的对象。

我真的希望SO能强迫人们在投票之前写一条评论。

这里有几个讨论,解释了为什么Dispose对于DataSet不是必要的。

处理还是不处理?

DataSet中的Dispose方法存在只是因为继承的副作用——换句话说,它在终结中实际上没有做任何有用的事情。

应该在数据表和数据集对象上调用Dispose吗?其中包括一位最有价值球员的解释:

这个系统。数据命名空间(ADONET)不包含 非托管资源。因此,没有必要处理任何这些作为 只要你没有给自己加上什么特别的东西。

了解Dispose方法和数据集?有来自权威斯科特·艾伦的评论:

在实践中,我们很少处理数据集,因为它没有什么好处。”

所以,共识是,目前没有好的理由调用Dispose在一个数据集上。

这可能是处置和释放DataSet所消耗的内存的最佳/适当的方式。

try
    {
        DataSet ds = new DataSet("DS");
        //use table DataTable here
        
    }
    catch {  }
    finally
    {
        if (ds != null)
                {
                    ds.EnforceConstraints = false;
                    ds.Relations.Clear();
                    int totalCount = ds.Tables.Count;

                    for (int i = totalCount - 1; i >= 0; i--)
                    {
                        DataTable td1 = ds.Tables[i];
                        if (td1 != null)
                        {
                            td1.Constraints.Clear();
                            td1.Clear();
                            td1.Dispose();
                            td1 = null;
                        }
                    }

                    ds.Tables.Clear();
                    ds.Dispose();
                    ds = null;
                }
    }

数据表是您自己创建的吗?因为迭代任何对象的子成员(如DataSet.Tables)通常是不需要的,因为父对象的工作是处理它所有的子成员。

一般来说,规则是:如果你创建了它并且它实现了IDisposable,那么就Dispose它。如果你没有创建它,那么不要处理它,这是父对象的工作。但每个对象可能有特殊的规则,检查文档。

对于。net 3.5,它明确地说“当不再使用时处理它”,所以这就是我要做的。

数据集通过MarshalByValueComponent实现IDisposable,它实现了IDisposable。因为数据集是管理的,所以调用dispose并没有真正的好处。