使用后是否有必要配置DbCommand?

我们使用Enterprise Library 3.0访问Oracle DB(microsoft oracle客户端)。 在调用存储过程或函数后不处理DbCommand实例时会发生什么? .NET会自动垃圾收集吗? 请注意,我们确保事务/连接已关闭并正确处理。

这是重复的,但我没有时间找到原件。

如果它实现了IDisposable,并且如果你创建了它,那么你需要在它上面调用Dispose。 这就是为什么该类的开发人员使它实现IDisposable。

垃圾收集器不会对所有IDisposable实现对象调用Dispose。

Reflector并不表示OracleCommand特别重写Dispose(无论如何都是来自System.ComponentModel.Component的实现),因此如果你不调用它,它很可能不会对你的应用程序造成太大影响。

但重要的是, OracleCommand专门实现了IDbCommand ,它专门实现了IDisposable 。 如果你曾经用另一个IDbCommand替换你的OracleCommand ,那么你很可能想要使用Dispose() 。 虽然SqlCommand没有显式覆盖Dispose() ,但Odbc和OleDb肯定会这样做。

简而言之,因为它是IDisposable ,你应该处理它,只是为了安全起见。

IDisposable的文档:

此接口的主要用途是释放非托管资源。 当不再使用该对象时,垃圾收集器会自动释放分配给托管对象的内存。 但是,无法预测垃圾收集何时发生。 此外,垃圾收集器不了解非托管资源,例如窗口句柄,或打开文件和流。

使用此接口的Dispose方法与垃圾收集器一起显式释放非托管资源。 当不再需要该对象时,对象的使用者可以调用此方法。

鉴于此,实现IDisposable的对象可能会维护对非托管资源的引用。 在垃圾收集器出现并收集对象之前,不会释放这些资源。 但是,由于您无法知道垃圾收集器何时执行此操作,因此一次性对象(例如OracleDbCommand )可能会比您希望的更长时间地挂起。

如果对象实现了IDisposable则应尽快调用它以释放它保存引用的非托管资源。 这可以通过直接调用Dispose或在using块中声明它来完成。

不是100%肯定Oracle,但在使用SqlCommand时,必须在使用后处理它。 您可以只调用.Dispose(),或者只是将它放在using块中,如下所示:

 using(DbCommand cmd = new DbCommand(foo, bar)) { // use cmd object }