2008-09-03 10 views
1

本質的に私は、VB.NET 2005でsqlコマンドを使用している場合、それを再使用することは、NEWが間違っているかどうかを知りたいです。メモリリークの原因になりますか?VB6で変数を再利用するのは良い考えですか?

EG:

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 

編集:それが実行されたときに

答えて

6

、ここではそのためのコードです:

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 

(編集)FYI、自動的に使用すると、上のDisposeメソッドを呼び出します/最後に試して周りのコードのブロックをラップと同じようにそれが作成される変数したがって、あなたのリソースが解放されることを保証する簡単な方法です。 http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx

2

ガベージコレクションが最初に新しいを集めますそれらを使用していないについてのコメントを避けるためでキャッチしようと置きます。

あなたが故意に最後にブロックした2番目のものだけです。最初のガベージコレクションは、ガベージコレクションが実行されたときに処分されます。

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

より良い方法は、最初のコマンドを使用した後に処分してから、再使用することです。

0

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

ガベージコレクタは、大きなオブジェクトヒープに移動されていない限り、参照解除されたものをすべてピックアップする必要があります。ただ、Longhorn213が言ったことを拡張する

0

ガベージコレクションがあなたの後にクリーンアップしますけれども、最終的処分パターンは、すべてのリソースが早くオブジェクトに関連付けられたシステムのリリースを助けるためにそこにある、あなたは再び割り当てる前にオブジェクトで行われたら、処分呼び出す必要がありますそれに。

1

ええとが、すべての人々が言っ​​に「それについては心配しないでください、それはOKですが、GCはそれを処理します...」Disposeパターンの全体ポイントはGC それらのリソースを処理するためであることができます」 tを処分する。したがって、オブジェクトにDisposeメソッドがある場合は、完了したらオブジェクトを呼び出す方がよいでしょう。

要するに、Longhorn213は正しいです、彼に聞いてください。

1

私が練習したことのないこと - 私はIDisposableを実装するクラスを持っていますが、私は実際にそれを自分自身で処理することはありません。GCのためにぶら下げています。

+0

いいえ(http://blogs.msdn.com/b/clyon/archive/2004/09/21/232445.aspx) –

0

注意してください。ループの中でこれらのことをたくさん行う必要がある場合は、遅くなることがあります。最初のコマンドは、もはやある場合にのみ動作することを、もちろん

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

    mySql.CommandText = otherSql 

    'do other stuff' 
End Using 

:それは(あなたが少し構文をクリーンアップすることはできません、また)ちょうどこのように、同じコマンドの.CommandTextプロパティを更新するために、多くの方が良いでしょうアクティブ。あなたがまだデータプレイヤーを通過中であれば、新しいコマンドを作成する方がよいでしょう。

関連する問題