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
calls GC.SuppressFinalize(this)
in its Dispose()
- skipping this means having to wait for dozens if not hundreds of Gen0
collections before memory is reclaimed.
Further Reading:
See this question and the related answer.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…