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

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

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

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

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

附录:

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

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

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


当前回答

不需要Dispose() 因为DataSet继承了MarshalByValueComponent类,而MarshalByValueComponent实现了IDisposable接口

其他回答

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

每当一个对象实现IDisposeable时,我就调用dispose。它的存在是有原因的。

数据集可能占用大量内存。它们越早被标记为清理越好。

更新

我已经5年没有回答这个问题了。我仍然同意我的答案。如果存在dispose方法,则应该在处理完对象时调用该方法。实现IDispose接口是有原因的。

这是正确处置数据表的方法。

private DataTable CreateSchema_Table()
{
    DataTable td = null;
    try
    {
        td = new DataTable();
        //use table DataTable here
        
        return td.Copy();
    }
    catch {  }
    finally
    {
        if (td != null)
        {
            td.Constraints.Clear();
            td.Clear();
            td.Dispose();
            td = null;
        }
    }
}

尝试使用Clear()函数。 这对我来说很有用。

DataTable dt = GetDataSchema();
//populate dt, do whatever...
dt.Clear();

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

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