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

私の意見では、ここで従うべき2つのルールがあります。

  1. IDisposableを実装するクラスは、usingブロックでラップする必要があります。
  2. ルール1を無視するために、クラスのIDisposableの実装に依存しないでください。

つまり、接続オブジェクトの破棄によって関連するコマンドオブジェクトの破棄が処理されることがわかっている場合でも、この動作に依存しないでください。

ちなみに、ブロックを使用してよりクリーンな方法でネストすることは可能です。

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

そして私は使用します

SqlCommand command = conn.CreateCommand();

新しいSqlCommandを作成し、それを接続に関連付ける代わりに。

于 2010-04-16T20:52:46.947 に答える
5

技術的には必要ありません。を閉じるSqlConnectionと、が使用しているすべてのリソースが破棄されます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 に答える