4

我注意到This question,但我的问题更具体一些。

使用有什么好处吗

using (SqlConnection conn = new SqlConnection(conStr))
{
     using (SqlCommand command = new SqlCommand())
     {
        // dostuff
     } 
}

代替

using (SqlConnection conn = new SqlConnection(conStr))
{
     SqlCommand command = new SqlCommand();
     // dostuff
}

显然,如果您计划在同一个连接上运行多个命令,这很重要,因为关闭一个连接SqlDataReader比关闭和重新打开一个连接更有效(调用conn.Close();conn.Open();也将释放连接)。

我看到很多人坚持认为未能关闭SqlDataReader意味着留下开放的连接资源,但这是否仅适用于您不关闭连接的情况?

4

5 回答 5

16

在我看来,这里有两个规则:

  1. 实现 IDisposable 的类应该包装在一个using块中。
  2. 您不应依赖 IDisposable 的类的实现来忽略规则 1。

也就是说,即使您知道处理连接对象会处理其关联的命令对象,您也不应该依赖此行为。

顺便说一句,可以以更清洁的方式使用块进行嵌套:

using (SqlConnection conn = new SqlConnection(conStr))
using (SqlCommand command = new SqlCommand())
{
    // dostuff
}

我会用

SqlCommand command = conn.CreateCommand();

而不是创建一个新的 SqlCommand 然后将其与连接相关联。

于 2010-04-16T20:52:46.947 回答
5

从技术上讲,它是不需要的;关闭 aSqlConnection应该销毁SqlDataReader正在使用的任何资源。反之亦然;如果您处置Dispose使用.SqlConnectionSqlDataReaderCommandBehavior.CloseConnection

但实际上,当一个类实现时IDisposable,你应该Dispose在完成它时使用它。框架类的实现细节随时可能发生变化,除非文档特别概述了不需要Dispose实例的情况,否则将来的某些更改/更新总是有可能导致您的代码拥有资源泄漏。

这真的不需要额外的努力 - 所以只需将它包裹在一个using块中。

于 2010-04-16T20:47:35.987 回答
1

在很多情况下可能没有必要,但这是最佳实践是有原因的。没有理由让资源持续到不再有用的程度。该using构造有助于确保这一点。

于 2010-04-16T20:44:49.813 回答
0

这不只是您现在释放资源与垃圾收集稍后释放它的问题吗?

于 2010-04-16T20:43:49.827 回答
0

有区别。如果您在没有打开/关闭连接的情况下创建了其中的两个阅读器,但在使用第二个之前不处理第一个阅读器,则会出现冲突,说明该连接已与打开的阅读器相关联。

于 2017-02-07T21:11:15.047 回答