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

如果您的类拥有实现的对象IDisposable,那么您的类需要实现IDisposable。就是这么简单。没有什么魔法Dispose可以召唤IDisposable你班上的所有成员。

于 2013-07-17T17:48:23.850 回答
1

经过大量研究和一些答案/评论的提示后,我将回答我自己的问题。

底层 StreamReader 具有非托管资源,因此我们希望确保它得到正确处理。

底层的 StreamReader 会被自动处理掉吗? 是的。任何 MyReader 对象都是托管资源,它具有底层 StreamReader 和非托管资源。当 MyReader 超出范围时,它不会坐下来占用内存,而是最终被垃圾收集器拾取。垃圾收集器将调用底层 StreamReader 上的 Finalize(),后者又调用其 Dispose() 方法,释放 StreamReaders 非托管资源。

所以,我们不需要实现 IDisposable。

我们应该实现 IDisposable 吗? 是的。我们可以通过实现 IDisposable 并将其最终在上一个答案中转换为立即(或至少尽快)来使该类变得更好。为了获得这些好处,我们还必须在 Using 语句中实例化 MyReader,或者在完成后调用 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

如果您希望在不显式调用 .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 回答