0

Visual Basicでは、次のようなコードがあります

Public Class MyReader

    Private _StreamReader As System.IO.StreamReader

    Public Sub New(ByRef File As String)
        Me._StreamReader = New System.IO.StreamReader(File)
    End Sub

End Class

このクラスで IDisposable を実装する必要がありますか? MyReader オブジェクトが範囲外になった場合、基になる StreamReader で .Dispose() が自動的に呼び出されますか?

4

3 に答える 3

1

ここでのいくつかの回答/コメントからのかなりの調査とヒントの後、私は自分の質問に答えるつもりです。

基になる StreamReader には管理されていないリソースがあるため、適切に破棄されるようにする必要があります。

基になる StreamReader は自動的に破棄されますか? はい。すべての MyReader オブジェクトは、管理されていないリソースを持つ基になる StreamReader を持つ管理されたリソースです。MyReader が範囲外になると、メモリを占有するのではなく、最終的にはガベージ コレクターによって取得されます。ガベージ コレクターは、基になる StreamReader で Finalize() を呼び出します。これにより、その Dispose() メソッドが呼び出され、StreamReader のアンマネージ リソースが解放されます。

したがって、 IDisposable を実装する必要はありません。

とにかく IDisposable を実装する必要がありますか? はい。IDisposable を実装し、最終的には前の回答ですぐに(または少なくともできるだけ早く) に変えることで、クラスを改善できます。これらの利点を得るには、MyReader を Using ステートメントでインスタンス化するか、処理が完了したら MyReader で Dispose() を呼び出す必要もあります。

IDisposable を実装した後、MyReader を使用する最良の方法は次のとおりです。

Using MR As New MyReader("Myfile.txt")
    'Do stuff
End Using

また

Dim MR As New MyReader("Myfile.txt")
    'Do stuff
MR.Dispose()

上記の回答で私が犯した間違いを自由に書き留めてください。また、MyReader とその基盤となる StreamReader を手動で破棄せず、ガベージ コレクターにそれを許可しないと、どのような悪いことが起こるか (もしあれば) にも興味があります。

于 2013-07-17T20:23:42.800 に答える
1

クラスが を実装するオブジェクトを保持している場合、クラスはIDisposableを実装する必要がありますIDisposable。それはそれで簡単です。クラスのすべてのメンバーDisposeに対して呼び出される魔法はありません。IDisposable

于 2013-07-17T17:48:23.850 に答える
-1

明示的に .Dispose を呼び出さずに (または最終的にガベージ コレクター .Collect を使用せずに) Dispose したい場合は、次のように Using でラップする必要があります。

Public Class MyReader

    Private _StreamReader As System.IO.StreamReader

    Public Sub New(ByRef File As String)
        Using _StreamReader As New System.IO.StreamReader(File)
            ' Do stuff here
        End Using
        ' At this point, _StreamReader is disposed of
    End Sub

End Class
于 2013-07-17T17:38:44.817 に答える