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()方法DataSet和DataTable存在 - 换句话说,它实际上并没有在最终化中做任何有用的事情.
事实证明DataSets,DataViews,DataTables抑制定稿他们constructorsc这就是为什么叫Dispose()他们明确什么都不做.
据推测,这是因为,如上所述,他们没有非托管资源; 因此,尽管MarshalByValueComponent允许非托管资源,但这些特定实现没有必要,因此可以放弃最终确定.
这个巨大的答案概述:
毫无疑问,应该在任何Finalizable对象上调用Dispose.
DataTables是Finalizable.
调用Dispose可以显着加快内存的回收速度.
MarshalByValueComponent调用GC.SuppressFinalize(this)它Dispose()- 跳过这意味着在Gen0回收内存之前必须等待数十个甚至数百个集合.
进一步阅读:
Dispose()方法是不是释放内存并使对象为null?
Dispose处理模式不是用于回收托管内存或"删除"托管对象(既不能做的事情也不是垃圾收集器的用途),而是用于处理非托管资源或其他可释放的托管资源的处理/释放物品,如SqlConnection.它肯定不会null作为参考,但可能会使其从处置之前无法使用.
我怎样才能使它成为null或释放这个对象占用的内存?
如果你想使引用为空,只需要dt = null工作,虽然这不会给你带来任何好处,因为DataTable引用了实例grdView.DataSource.双方dt并grdView.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)
| 归档时间: |
|
| 查看次数: |
34634 次 |
| 最近记录: |