Datatable.Dispose()会从内存中删除吗?

Raj*_*mar 9 c# dispose winforms system.data.datatable

我通过非常简单的代码进行研究,并且一直看到数据表的dispose()结果

以下是代码

DataTable dt= new Datatable();
SqlCommand Cmd = new SqlCommand("sp_getData",SqlCon);
SqlCommand.CommandType= CommandType.StroedProcedure;
SqlCon.Open();
sqlDataReader dr=  cmd.ExecuteReader();
dt.Load(dr);
SqlCon.Close();
grdView.DataSource =dt;
dt.Dispose() // Here I dispose the table as it is no use for me & wanna memory free from this
Run Code Online (Sandbox Code Playgroud)

但在处理掉数据表之后我仍然发现它仍然显示RowCount = 10k.

Dispose()方法是不是释放内存并使对象为null?

我怎样才能使它成为null或释放这个对象占用的内存?

Moo*_*ght 20

DataSet并且DataTable实际上没有任何非托管资源,因此Dispose()实际上并没有做太多.只存在继承的副作用的Dispose()方法DataSetDataTable存在 - 换句话说,它实际上并没有在最终化中做任何有用的事情.

事实证明DataSets,DataViews,DataTables抑制定稿他们constructorsc这就是为什么叫Dispose()他们明确什么都不做.

据推测,这是因为,如上所述,他们没有非托管资源; 因此,尽管MarshalByValueComponent允许非托管资源,但这些特定实现没有必要,因此可以放弃最终确定.

这个巨大的答案概述:

毫无疑问,应该在任何Finalizable对象上调用Dispose.

DataTables是Finalizable.

调用Dispose可以显着加快内存的回收速度.

MarshalByValueComponent调用GC.SuppressFinalize(this)Dispose()- 跳过这意味着在Gen0回收内存之前必须等待数十个甚至数百个集合.

进一步阅读:

看到这个问题和相关的答案.

  • 谢谢,但答案令人困惑。结论是什么? (3认同)

Ada*_*rth 8

Dispose()方法是不是释放内存并使对象为null?

Dispose处理模式不是用于回收托管内存或"删除"托管对象(既不能做的事情也不是垃圾收集器的用途),而是用于处理非托管资源或其他可释放的托管资源的处理/释放物品,如SqlConnection.它肯定不会null作为参考,但可能会使其从处置之前无法使用.

我怎样才能使它成为null或释放这个对象占用的内存?

如果你想使引用为空,只需要dt = null工作,虽然这不会给你带来任何好处,因为DataTable引用了实例grdView.DataSource.双方dtgrdView.DataSource会以同一个基础的参考DataTable实例.

我也怀疑这是一种方法的一部分,在这种方法中,dt方法范围无论如何.

你不应该过分担心这些东西.我更关心的是在/ 的SqlConnection外面,你有可能在那里打开一个连接.try-finallyusing

我倾向于赞成呼吁Dispose在实现项目IDisposable什么,我认为这是一个非常好的理由:这是公共合同.调用它是否有效的事实是一个实现细节,并且可能会立即发生变化.


顺便说一句,我会完全重写你的代码:

var dt = new Datatable();

using (var conn = new SqlConnection(""))
using (var comm = new SqlCommand("sp_getData", conn))
{
    conn.Open();

    using (var reader = comm.ExecuteReader())
    {
        dt.Load(reader);
    }
}

grdView.DataSource = dt;
Run Code Online (Sandbox Code Playgroud)