DataSet和DataTable都实现了IDisposable,因此,根据传统的最佳实践,我应该调用它们的Dispose()方法。
然而,从我目前所读到的内容来看,DataSet和DataTable实际上没有任何非托管资源,因此Dispose()实际上并没有做太多工作。
另外,我不能只使用using(DataSet myDataSet…),因为DataSet有一个数据表的集合。
因此,为了安全起见,我需要遍历myDataSet。表,释放每个数据表,然后释放数据集。
那么,对我所有的数据集和数据表调用Dispose()是否值得呢?
附录:
对于那些认为数据集应该被处理的人:
一般来说,处理的模式是use using或try..最后,因为您希望保证Dispose()将被调用。
然而,对于集合来说,这很快就会变得很糟糕。例如,如果对Dispose()的调用之一抛出异常,该怎么办?是否吞下它(这是“坏的”)以便继续处理下一个元素?
或者,您是否建议我只调用myDataSet.Dispose(),而忘记在myDataSet.Tables中处理数据表?
即使对象没有非托管资源,通过打破对象图,处理也可以帮助GC。一般来说,如果一个对象实现了IDisposable,则应该调用Dispose()。
Dispose()是否实际执行某些操作取决于给定的类。对于DataSet, Dispose()实现继承自MarshalByValueComponent。它从容器中移除自身并调用dispose事件。源代码如下(用。net Reflector分解):
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
lock (this)
{
if ((this.site != null) && (this.site.Container != null))
{
this.site.Container.Remove(this);
}
if (this.events != null)
{
EventHandler handler = (EventHandler) this.events[EventDisposed];
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
}
}