VB6 で変数を再利用することは良い考えですか?
-
09-06-2019 - |
質問
基本的に、VB.NET 2005 で sql コマンドを使用し、それを NEW を使用して再利用することが間違っているかどうかを知りたいのです。メモリリークが発生するのでしょうか。
例えば:
try
dim mySQL as new sqlcommand(sSQL, cnInput)
// do a sql execute and read the data
mySQL = new sqlcommand(sSQLdifferent, cnInput)
// do sql execute and read the data
catch ...
finally
if mysql isnot nothing then
mysql.dispose
mysql = nothing
end if
編集:Try catch を使用しないことに関するコメントを避けるために、try catch を入れてください。
解決
Longhorn213 が言ったことを拡張するために、コードを次に示します。
Using mysql as SqlCommand = new SqlCommand(sSql, cnInput)
' do stuff'
End Using
Using mysql as SqlCommand = new SqlCommand(otherSql, cnInput)
' do other stuff'
End Using
(編集) 参考までに、 を使用すると、作成された変数の Dispose メソッドを呼び出す try/finally の周囲にコードのブロックが自動的にラップされます。したがって、リソースを確実に解放する簡単な方法です。 http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx
他のヒント
ガベージ コレクションは、実行時に最初の新しいものを収集します。
意図的に Final ブロックに破棄するのは 2 番目のみです。最初のものは、次回ガベージ コレクションが実行されるときに破棄されます。
これは良い考えとは思えません。最初のコマンドが正しく閉じられていない場合、データベースへの接続が開いたままになり、その接続が破棄されない可能性があります。
より良い方法は、最初のコマンドを使い終わった後に破棄し、それを再利用することです。
ああ、「大丈夫、心配しないで、GC が解決してくれるから...」と言っている人たち全員に。 ポイント の Dispose
パターンは、これらのリソースを GC で処理することです できない 処分する。したがって、オブジェクトに Dispose
メソッドを使い終わったら呼び出すとよいでしょう。
要約すると、Longhorn213 の意見は正しいです。彼の言うことを聞いてください。
私が解決できなかったことが 1 つあります - クラスを実装している場合 IDisposable
, 、でも実際に自分で破棄したことはなく、GC のためにぶらぶらしたままにしています。GC は実際に呼び出しますか? Dispose
私にとって?
いいえ、ガベージ コレクターは古いバージョンの mySql を見つけて、やがて割り当てを解除します。
ガベージ コレクターは、ラージ オブジェクト ヒープに移動されていない限り、逆参照されたものをすべて取得する必要があります。
ガベージコレクションはあなたの後にクリーンアップしますが、 最終的に 破棄パターンは、システムがオブジェクトに関連付けられたリソースをより早く解放できるようにするためにあります。そのため、オブジェクトの使用が完了したら、オブジェクトに再割り当てする前に、dispose を呼び出す必要があります。
気をつけて。これらをループ内で多数実行する必要がある場合、処理が遅くなる可能性があります。次のように、同じコマンドの .CommandText プロパティを更新する方がはるかに良いです (構文を少し整理することもできます)。
Using mysql as New SqlCommand(sSql, cnInput)
' do stuff'
mySql.CommandText = otherSql
'do other stuff'
End Using
もちろん、これは最初のコマンドがアクティブでなくなった場合にのみ機能します。まだデータリーダーを使用している途中の場合は、新しいコマンドを作成した方がよいでしょう。