[英]Datatable.Dispose() will make it remove from memory?
我通過非常簡單的代碼進行研究,並且一直看到數據表的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或釋放這個對象占用的內存?
DataSet
和DataTable
實際上沒有任何非托管資源,因此Dispose()
實際上並沒有做太多。 DataSet
和DataTable
的Dispose()
方法僅存在,因為繼承的副作用 - 換句話說,它實際上並沒有在最終化中做任何有用的事情。
事實證明, DataSets
, DataViews
, DataTables
在其構造函數中抑制了最終化,這就是為什么在它們上顯式調用Dispose()
什么也不做。
據推測,這是因為,如上所述,他們沒有非托管資源; 因此,盡管MarshalByValueComponent
允許非托管資源,但這些特定實現並不需要,因此可以放棄最終確定。
這個巨大的答案概述:
毫無疑問,應該在任何Finalizable對象上調用Dispose。
DataTables是Finalizable。
調用Dispose可以顯着加快內存的回收速度。
MarshalByValueComponent
在其Dispose()
調用GC.SuppressFinalize(this)
- 跳過這意味着在回收內存之前必須等待數十個(如果不是數百個)Gen0
集合。
進一步閱讀:
Dispose()方法是不是釋放內存並使對象為null?
Dispose
和處置模式不是用於回收托管內存或“刪除”托管對象(您不能做的事情和垃圾收集器的用途),它用於處理非托管資源或其他托管資源的處理/釋放可釋放的項目,例如SqlConnection
。 它肯定不會使引用null
,但可能會使其從處置轉發時起無法使用。
我怎樣才能使它成為null或釋放這個對象占用的內存?
如果你想使引用為空,只需dt = null
即可,但是這不會給你帶來任何好處,因為grdView.DataSource
引用了DataTable
實例。 dt
和grdView.DataSource
都將引用同一個底層DataTable
實例。
我還懷疑這是方法的一部分,其中dt
無論如何都是方法范圍的。
你不應該過分擔心這些東西。 我更關心在try-finally
/ using
之外using
SqlConnection
,你有可能在那里打開一個連接。
我傾向於贊成呼吁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;
嘗試使用Clear()函數。 這對我來說非常適合處置。
DataTable dt = GetDataSchema();
//populate dt, do whatever...
dt.Clear();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.