0

私の質問は IDisposable の実装に関するものです。私の知る限り、コードまたはセクションが完了すると、変数またはインスタンスは破棄されます。ステートメントが間違っている場合は修正してください。以下は私のプログラムの一部です:

 If Con.State = ConnectionState.Closed Then Con.Open()
        Cmd = New SqlCeCommand("Select * from BillItem", Con)
        Rdr = Cmd.ExecuteReader()
        While Rdr.Read = True
            Dim x As New Classes.StockRoster
            x.BillID = Rdr("BillID")
            x.IsSales = Rdr("IsSales")
            x.Quantity = Rdr("Quantity")
            x.ContactBase = (From t As CommonCodes.ItemBase In ContactsbaseDict Where t.ID = BillContactDict(x.BillID)).First
            x.StockEntityBase = StockEntitydict(Rdr("StockID"))
            x.BillDate = Rdr("BillDate")
            result.AddRange(x)
        End While
        Con.Close()
 End IF

ここで X 変数の場合、I x (または StockRoster) が IDisposable インターフェイスを使用すると、メモリが改善されますか?

デフォルトでは、各ループの最後にリソースを破棄できませんでしたか?

4

2 に答える 2

1

まず、If-clause接続が開いている場合、例外が発生した場合に何が起こるかを入力することはありません。

実際、接続は最良の例です。常にできるだけ早く接続を閉じます。最も簡単な方法は、最後using-statementに which 呼び出しを使用することですDispose(例外の場合でも)。に似ていTry/Catch/Finallyます。Connection.Disposeまた、暗黙的に閉じます。

経験則として: (上記のような)using-statement実装には を使用してください。IDisposableSqlCeCommand

実際の質問に答えるには:

Ix (または StockRoster) が IDispose クラスを使用する場合、メモリの改善はありますか?各ループの最後にデフォルトでリソースを破棄できませんか?

メモリの改善とはIDisposableインターフェイスです。クラスが実装していない場合でも、dispose または close を呼び出すことができますIDisposable。これは、管理されていないリソースを使用している可能性があり、できるだけ早く破棄する必要があるというヒントにすぎません。

于 2012-07-25T20:04:21.617 に答える
1

IDisposableデータベース接続などの管理されていないリソースを破棄することです。ガベージコレクションとは何の関係もありません。

あなたのStockRosterクラスはアンマネージ リソースを保持していないようですので、実装する必要はありませんIDisposableforあったとしても、後で使用する結果リストにインスタンスを追加するため、ループ内で破棄することは意味がありません。ループで破棄するとfor、呼び出し元のコードでインスタンスが使用できなくなります。

于 2012-07-25T20:02:27.450 に答える