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 に答える