我应该Dispose() DataSet和DataTable吗?

216

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

然而,从我迄今为止所读到的内容来看,DataSet和DataTable实际上没有任何非托管资源,因此Dispose()并没有实际作用。

此外,我不能仅仅使用using(DataSet myDataSet...) ,因为DataSet有一个DataTable集合。

因此,为了安全起见,我需要遍历myDataSet.Tables,处理每个DataTable,然后处理DataSet。

所以,是否值得在所有的DataSets和DataTables上调用Dispose()这么麻烦呢?

附录:

对于那些认为DataSet应该被销毁的人们: 通常,处理销毁对象的模式是使用usingtry..finally,因为你想要保证Dispose()将被调用。

但是,对于集合来说,这很快变得混乱。例如,如果其中一个Dispose()的调用引发异常怎么办?您会忽略它(这是“不好”的),以便可以继续处理下一个元素吗?

还是建议我只调用myDataSet.Dispose(),而忽略在myDataSet.Tables中销毁DataTables的操作呢?


10
Dispose不应该抛出任何异常。如果它做到了,那么它就写得不好,所以...try { some.Dispose(); } catch {}足矣。 - LukeSw
1
在实际应用中,并不是所有类都需要实现Dispose()方法,这会引起很多困惑。我只希望MSDN能够更好地记录这些类的特殊性质。 - Krugar
这并不是严格意义上的没有必要。只是在这个时刻没有未管理的资源。其他实现可能会引入它们。你需要决定什么是最好的,但要知道,在微软实现中,Dispose 最坏的情况下很可能只是一个无操作。 - user7116
7
我注意到我的一个应用程序中存在明显的内存泄漏问题,该应用程序使用了大量的 DataSet 对象。我之前没有调用 .Dispose() 方法或使用 "using" 块来处理这些对象。因此,我检查了代码,并在创建 DataSet 或 DataTable 的每个地方添加了 "using" 块,结果内存得以释放。这对我来说是一个坚实的证明:针对 DataSet 和 DataTable ,.Dispose() 方法确实是必需的。 - blitz_jones
12个回答

0

这是正确的方法来适当地释放 DataTable

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;
        }
    }
}

0

这可能是释放由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;
                }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接