30

私は通常、次のようなコードを使用します。

using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
{
   var command = connection.CreateCommand();
   command.CommandText = "...";
   connection.Open();
   command.ExecuteNonQuery();
}

command自動的に廃棄されますか? usingまたはそうではなく、ブロックにラップする必要がありますか? 処分する必要はありSqlCommandますか?

4

6 に答える 6

32

これを行うだけです:

using(var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
using(var command = connection.CreateCommand())
{
   command.CommandText = "...";
   connection.Open();
   command.ExecuteNonQuery();
}

コマンドで dispose を呼び出さなくても、それほど悪いことはありません。ただし、 Dispose を呼び出すと、 finalizer への呼び出しが抑制され、 dispose の呼び出しによりパフォーマンスが向上します。

于 2009-11-27T10:51:34.147 に答える
15

Dispose()最も安全なポリシーは、オブジェクトが を実装している場合IDisposable、明示的にまたは using ブロックを介して常に呼び出すことです。必要ない場合もありますが、とにかく呼び出しても問題が発生することはありません (クラスが正しく記述されている場合)。また、実装がいつ変更される可能性があるかはわかりません。つまり、以前は呼び出しが必要ではなかった場所が、今では確実に必要になっています。

あなたが与えた例では、コマンドに余分な内側の using ブロックを追加するだけでなく、接続の外側の using ブロックを維持することができます。

于 2009-11-27T10:51:08.127 に答える
6

はい、実装が現在あまり機能していなくても、将来どのように変更されるかはわかりません (新しいフレームワーク バージョンなど)。一般に、実装するすべてのオブジェクトをIDisposable安全側に配置する必要があります。

ただし、操作が延期され、完全なスコープを制御できない場合 (たとえば、非同期で作業している場合、または a などを返す場合)、 toSqlDataReaderを設定して、リーダーが完了するとすぐに接続が適切になるようにすることができます。あなたのために閉じられた/処分されました。CommandBehaviorCloseConnection

于 2009-11-27T12:15:12.650 に答える
4

実際には、スキップできますDispose。リソースは解放されません。SQLCommand コンストラクターがそれを行うため、ファイナライズも抑制しません。

Component理論的には、Microsoft はアンマネージ リソースを保持するように実装を変更することができますが、そうするずっと前に、基本クラスを取り除く API を開発してくれることを願っています。

于 2015-10-16T21:30:20.067 に答える
3

Reflectorまたは dotPeek またはhttps://referencesource.microsoft.com/を使用して、この種のものを見つけることができます。

私は少し掘り下げました(私はそれほど一生懸命努力しなかったので、残りの部分を完全に確認するために自分自身を掘り下げることをお勧めします)。そのつながりで。さらに、実際には、コマンドの破棄が実際にそれほど多くのことをしているようには見えません。フィールドをnullに設定し、コンテナから切り離し(これによりマネージメモリリークを防ぐことができます)、イベントを発生させます(これは重要かもしれませんが、誰がこのイベントをリッスンしているかわかりません)。

いずれにせよ、このようなものを using ブロックで使用するか、接続を保持するオブジェクトの破棄パターンを使用して確実に破棄することをお勧めします (コマンドをしばらく保持する場合)。

于 2009-11-27T12:03:03.077 に答える
0

私の意見では、 とDisposeの両方SqlConnectionを呼び出すことSqlCommandは良い習慣です。以下のコードを使用してください

using(var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
try{
    using(var command = connection.CreateCommand())
    {
       command.CommandText = "...";
       connection.Open();
       command.ExecuteNonQuery();
    }
}
catch(Exception ex){ //Log exception according to your own way
    throw;
}
finally{
    command.Dispose();
    connection.Close();
    connection.Dispose();
}
于 2019-03-01T12:14:55.540 に答える