C#中的IDbConnection和using块

3

我知道将IDbConnection对象放在using代码块中可以确保Dispose方法被调用并且它所使用的资源得到释放。话虽如此,我是否还需要将IDbCommand和IDataReader对象也放在using块中,或者仅仅将连接对象放在using块中就足够了呢?谢谢。


这取决于您正在设计的实际应用程序。在我的工作中,我需要一个持久连接,因此我不会将连接对象包装在using语句中,而是将所有命令和读取器都包装在using语句和try/catch块中,并确保每个try/catch的finally关闭连接。这样连接就是持久的...但在不使用时保持关闭状态。 - Nevyn
2个回答

2
有许多简单的方法可以在不查看文档的情况下为任何给定对象找到答案:
  1. 如果您将其包装在using块中并且它不是IDisposable,则会收到语法错误。
  2. 如果您的类有一个.Dispose方法(可以在Intellisense中轻松检查),则应该将其包装。
  3. 如果您的类实现了IDisposable(可以通过“转到定义”或VS中的新“查看”功能轻松检查),则应该将其包装。
另外,例如,您可以从MSDN文档中看到,IDbCommand实现了IDisposable,因此应使用using块处理。

广告2)“using”匹配是基于接口的,因此方法可能存在,但如果它没有实现“IDisposable”,则无法在“using”语句中使用它。而且,“IDisposable.Dispose”可以显式实现,方法可能不会在Intellisense中显示。 - MarcinJuraszek
True(通常方法为.Close()或类似方法),但这仍然是一种合理的检查方式。最终我总是会检查接口(#3),但其他方法偶尔也很有用。 - Dan Puzey

1
最佳实践是将任何受限的IDisposable对象包装在using块中。当您编写与接口交互的代码时,这一点尤其重要,因为您不知道底层实现的细节;在某些情况下可能很重要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接