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

Viv*_*vek 12 .net c# oracle

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

Joh*_*ers 19

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

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

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

  • 并非所有IDisposable用户都实现了终结器.并非所有归属者都将遵循标准模式.你不能依赖于终结器的存在,并且你不能依赖于被垃圾收集器调用的Dispose. (4认同)
  • @RandomEngy:这不是你之前的争论.垃圾收集器总是会调用Dispose.你改变了主意吗?这是你的新论点吗?如果是这样,那么请添加一个答案清楚地显示一个例子,说明何时最好忽略这个明确的最佳实践.为什么它比简单地调用Dispose或实现使用块更好? (2认同)
  • @RandomEngy:如果代码不正确,那么它不是更清晰.对不起,伙计,这简直太危险了.当奇怪的东西开始发生在"以前工作"的代码中时,我首先要找的是没有正确使用Dispose,然后无法正确处理异常.你给Murphy一个你不需要给的开场. (2认同)

Jer*_*rey 7

Reflector并没有表明OracleCommand具体覆盖Dispose(System.ComponentModel.Component无论如何都是来自实现),所以如果你不调用它,它很可能不会对你的应用程序造成太大影响.

但重要的是OracleCommand具体实现IDbCommand,具体实现IDisposable.如果您曾经替换OracleCommand过另一个IDbCommand,那么您很可能想要使用Dispose().虽然SqlCommand没有明确覆盖Dispose(),但Odbc和OleDb肯定会这样做.

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


Mik*_*fer 5

从文档中IDisposable

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

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

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

如果一个对象实现了IDisposable,你应该尽快调用它来释放它持有引用的非托管资源。这可以通过Dispose直接调用或在 using 块中声明来实现。