在using块中声明IDisposable成员和在using块声明时有什么区别?

3

我有以下代码:

    using (SqlCommand command = new SqlCommand())
    {

        command.CommandType = System.Data.CommandType.StoredProcedure;
        command.Connection = new SqlConnection();
        command.CommandText = "";

        command.Parameters.Add(new SqlParameter("@ExperienceLevel", 3).Direction = System.Data.ParameterDirection.Input);

        SqlDataReader dataReader = command.ExecuteReader();
   }

在我当前声明SqlConnection的位置和这样声明之间,是否存在功能影响?

using (SqlCommand command = new SqlCommand())
using (SqlConnection connection = new SqlConnection())

谢谢

4个回答

5
是的,两者是有区别的。释放 SqlCommand 不会自动释放与之相关联的 SqlConnection。这样可能会导致连接泄漏,并干扰 ADO.NET 连接池;如果您在代码运行时查看数据库服务器的活动情况,您将看到新的连接被打开但未关闭。
您应该始终使用第二个版本。实际上,SqlConnection 对象才是您真正需要 Dispose 的对象。您应该尽快处理任何实现了 IDisposable 接口的对象,但未处理 SqlConnection 尤其危险。

3

最好使用两个using块,每个资源一个。

在这种情况下,您可以只使用1个,但它应该围绕连接而不是命令。

但您真的不想了解或关心这些细节。如果一个类实现了IDisposable接口,则在using() { }块中使用其实例,除非有特殊原因不这样做。


2
我使用以下模式:
using(var connection = new SqlConnection("ConnectionName"))
using(var command = new SqlCommand())
{
   command.Connection = connection;
   // setup command
   var reader = command.ExecuteReader();
   // read from the reader
   reader.Close();
}

0

是的,下面的代码将正确地处理SqlConnection的释放,而上面的代码则不会。使用using块(在内部实现为try...finally)确保无论如何退出块,对象都将被处理。


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