簡體   English   中英

Datatable.Dispose()會從內存中刪除嗎?

[英]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或釋放這個對象占用的內存?

DataSetDataTable實際上沒有任何非托管資源,因此Dispose()實際上並沒有做太多。 DataSetDataTableDispose()方法僅存在,因為繼承的副作用 - 換句話說,它實際上並沒有在最終化中做任何有用的事情。

事實證明, 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 ,你有可能在那里打開一個連接。

我傾向於贊成呼吁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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM