在使用块或使用块声明时声明IDisposable成员的区别?

时间:2010-03-24 21:18:53

标签: c# dispose using-statement

我有以下代码:

    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 个答案:

答案 0 :(得分:5)

是的,有区别。处置SqlCommand不会自动处理与其关联的SqlConnection。您可以通过这种方式泄漏连接,它会干扰ADO.NET连接池;如果您在此代码运行时查看数据库服务器的活动,您将看到新连接被打开但未关闭。

您应始终使用第二个版本。事实上,SqlConnection对象是您真正需要Dispose的对象。你应该尽快处理实现IDisposable任何,但是没有处置SqlConnection是特别危险的。

答案 1 :(得分:3)

是的,最好使用2个块,每个资源1个。

在这种情况下,您只能使用1,但它应该在Connection周围,而不是在Command周围。

但你真的不想知道或关心这些细节。如果一个类实现了IDispsoable接口,那么在using() { }块中使用它的实例,除非有特殊原因不这样做。

答案 2 :(得分: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();
}

答案 3 :(得分:0)

是的,下面的代码会正确配置SqlConnection,上面的代码不会。 using块(在内部实现为try ... finally)确保无论您如何退出块,都将处置该对象。