I have researching through very simple code and get stuck on seeing the dispose() result of datatable
Following is the code
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
But after disposing off the datatable i still found that it is still showing RowCount = 10k.
Does Dispose() method does not free up the memory & make object as null ??
How can i make it as null or free up the memory occupied by this object ??
DataSet
and DataTable
don't actually have any unmanaged resources, so Dispose()
doesn't actually do much. The Dispose()
methods in DataSet
and DataTable
exists ONLY because of side effect of inheritance - in other words, it doesn't actually do anything useful in the finalization.
It turns out that DataSets
, DataViews
, DataTables
suppress finalization in their constructorsc this is why calling Dispose()
on them explicitly does nothing.
Presumably, this happens because, as mentioned above, they don’t have unmanaged resources; so despite the fact that MarshalByValueComponent
makes allowances for unmanaged resources, these particular implementations don’t have the need and can therefore forgo finalization.
Overview of this Immense Answer:
Without a doubt, Dispose should be called on any Finalizable objects.
DataTables are Finalizable.
Calling Dispose significantly speeds up the reclaiming of memory.
MarshalByValueComponent
callsGC.SuppressFinalize(this)
in itsDispose()
- skipping this means having to wait for dozens if not hundreds ofGen0
collections before memory is reclaimed.
Further Reading:
See this question and the related answer.