2

これまでこのフォーラムに投稿したことはありませんでしたが、研究のためによく使用していますが、今回は答えが見つかりませんでした... 言葉遣いが間違っているだけかもしれません。

私はしばらくの間取り組んできた Compact Framework プロジェクトで SqlCeCommand をかなり頻繁に使用しており、メモリ不足に関する多くの問題があったため、アンマネージ コード部分をより適切に最適化しようとしています。

これを見てください:

Dim SQLCmd as SQLCeCommand

SQLCmd = New SQLCeCommand
SQLCmd.Connection = conndb
... Process db stuff

SQLCmd = New SQLCeCommand
SQLCmd.Connection = conndb
... Process db stuff

SQLCmd = New SQLCeCommand
SQLCmd.Connection = conndb
... Process db stuff

SQLCmd.Dispose()

これで問題ありませんか、同じオブジェクトで New を呼び出すたびにメモリが失われますか? オブジェクトの同じインスタンスを保持するのではなく、これを行った理由は、毎回 SQLCmd プロパティを明示的に設定する必要がなかったからです。パラメータを使用するものと使用しないものがあるため、 new を使用すると、すべてが明確であることを確認する簡単な方法になると思いました。

これにアプローチするための考えやより良い方法はありますか?

4

1 に答える 1

0

あなたのコードでは、 New を呼び出すたびに以前の参照が失われ、現在は参照されていないオブジェクトを解放するのはガベージ コレクターの作業です。これは、ガベージ コレクター フレームワークがメモリを取り戻す時期であると判断した場合に発生するため、すぐには発生しません。

より良い作業を行うには、 Using ステートメントを使用できます

Dim SQLCmd as SQLCeCommand 

Using SQLCmd = New SQLCeCommand 
    SQLCmd.Connection = conndb 
    ... Process db stuff 
End Using

Using SQLCmd = New SQLCeCommand 
    SQLCmd.Connection = conndb 
    ... Process db stuff 
End Using

Using SQLCmd = New SQLCeCommand 
    SQLCmd.Connection = conndb 
    ... Process db stuff 
End Using

このようにして、前の SqlCmd に対して自動的に Dispose を呼び出し、ガベージ コレクターに未使用のメモリを収集するための強力なヒントを与えます。

MSDN から

Managed resources are disposed of by the .NET Framework garbage collector (GC) without any 
extra coding on your part. You do not need a Using block for managed resources. However, 
you can still use a Using block to force the disposal of a managed resource instead of 
waiting for the garbage collector.
于 2012-09-29T12:33:41.343 に答える