1

基本的に、VB.NET 2005でsqlcommandを使用し、次に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

編集:それらを使用しないことについてのコメントを避けるために、試してみてください

4

7 に答える 7

6

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

于 2008-09-03T19:59:08.940 に答える
2

ガベージコレクションは、実行時に最初の新しいものを収集します。

Finalブロックで意図的に破棄する2番目のもののみ。最初のガベージコレクションは、次にガベージコレクションが実行されるときに破棄されます。

これは良い考えではないと思います。最初のコマンドが正しく閉じられていない場合、データベースへの接続が開いている可能性があり、データベースは破棄されません。

より良い方法は、最初のコマンドを使い終わったら破棄し、それを再利用することです。

于 2008-09-03T19:54:07.407 に答える
1

ええと、「大丈夫です、心配しないでください。GCが処理します...」と言っているすべての人にとって、パターンの要点は、GCが処理できないリソースを処理することです。したがって、オブジェクトにメソッドがある場合は、それが終わったらそれを呼び出す方がよいでしょう。DisposeDispose

要約すると、Longhorn213は正しいので、彼の話を聞いてください。

于 2008-09-03T20:00:34.660 に答える
1

私がうまくいかなかった1つのこと-実装しているクラスがあり、IDisposable実際に自分でそれを破棄したことがない場合、GCのためにぶらぶらしたままにしておくと、GCは実際Disposeに私を呼び出しますか?

于 2008-09-03T20:25:56.190 に答える
0

いいえ、ガベージコレクターは古いバージョンのmySqlを見つけて、やがて割り当てを解除します。

ガベージコレクターは、ラージオブジェクトヒープに移動されていない限り、逆参照されたものをすべて取得する必要があります。

于 2008-09-03T19:54:30.637 に答える
0

ガベージコレクションは最終的にdisposeパターンが存在することでクリーンアップされますが、システムがオブジェクトに関連付けられたリソースをより早く解放できるようにするため、オブジェクトを使い終わったら、オブジェクトに再割り当てする前にdisposeを呼び出す必要があります。

于 2008-09-03T20:00:16.190 に答える
0

気をつけて。ループでこれらの多くを実行する必要がある場合は、遅くなる可能性があります。次のように、同じコマンドの .CommandText プロパティを更新する方がはるかに優れています (また、構文を少しクリーンアップすることもできます)。

Using mysql as New SqlCommand(sSql, cnInput)
  ' do stuff'

    mySql.CommandText = otherSql

   'do other stuff'
End Using

もちろん、これは最初のコマンドがアクティブでなくなった場合にのみ機能します。まだデータリーダーを使用中の場合は、新しいコマンドを作成することをお勧めします。

于 2008-09-04T03:04:06.780 に答える