3

如果我在一个块内实例化一个 SqlDataReader using,我需要调用close()阅读器吗?

查找用户的简单示例如下所示。

  using (var connection = new SqlConnection(Settings.GetValue("SqlConnection")))
  {
    SqlCommand command = new SqlCommand("select * from Users where Id = @Id", connection);        
    command.Parameters.Add("@Id", SqlDbType.UniqueIdentifier);
    command.Parameters["@Id"].Value = id;

    using (SqlDataReader reader = command.ExecuteReaderWithRetry())
    {
      reader.Read();

      if (reader.HasRows)
      {
        //Do work
      }

      //Is this neccesary?
      reader.Close();
    }
  }
4

1 回答 1

12

如果它在 using 块中,则它会自动关闭。您不需要显式关闭它。

顺便说一句,您示例中的 SqlCommand 是一次性的。您也应该在 using 块中创建它,否则它控制的任何资源在垃圾收集器收集之前都不会被释放。

您未处理的 SqlCommand 实际上是一个很好的例子,说明了为什么 C# 的 RAII 模拟不是“真正的”RAII。您必须采取显式操作(制作块)才能启动 RAII,这相当于显式关闭,尽管语法不同。

于 2013-05-03T16:46:59.527 回答