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

我通过非常简单的代码进行研究,并且一直看到数据表的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 

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

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

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

DataSetDataTable实际上没有任何非托管资源,因此Dispose()实际上并没有做太多。 DataSetDataTableDispose()方法仅存在,因为inheritance的副作用 – 换句话说,它实际上并没有在最终化中做任何有用的事情。

事实certificate, DataSetsDataViewsDataTables在其构造函数中抑制了最终化,这就是为什么在它们上面调用Dispose()显然什么都不做。

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

这个巨大的答案概述:

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

DataTables是Finalizable。

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

MarshalByValueComponent在其Dispose()调用GC.SuppressFinalize(this) – 跳过这意味着在回收内存之前必须等待数十个(如果不是数百个) Gen0集合。

进一步阅读:

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

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

Dispose和处置模式不是用于回收托管内存或“删除”托管对象(您不能做的事情和垃圾收集器的用途),它用于处理非托管资源或其他托管资源的处理/释放可释放的项目,例如SqlConnection 。 它肯定不会使引用null ,但可能会使其从处置转发时起无法使用。

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

如果你想使引用为空,只需dt = null即可,但是这不会给你带来任何好处,因为grdView.DataSource引用了DataTable实例。 dtgrdView.DataSource都将引用同一个底层DataTable实例。

我还怀疑这是方法的一部分,其中dt无论如何都是方法范围的。

你不应该过分担心这些东西。 我更关心在try-finally / using之外using SqlConnection ,你有可能在那里打开一个连接。

我倾向于倾向于对实现IDisposable项目调用Dispose ,因为我认为这是一个很好的理由:这是公共合同 。 调用它是否有效的事实是一个实现细节 ,并且可能会立即发生变化


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

 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; 

尝试使用Clear()函数。 这对我来说非常适合处置。

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