具有底层流读取器的类。我需要实现IDisposable吗?

时间:2013-07-17 17:19:41

标签: vb.net idisposable

在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()吗?

3 个答案:

答案 0 :(得分:1)

如果您的班级包含实施IDisposable的对象,那么您的班级需要实施IDisposable。就是这么简单。没有任何魔法可以为您班级的所有Dispose成员调用IDisposable

答案 1 :(得分: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并允许垃圾收集器执行此操作,我也会对可能发生的坏事(如果有的话)感兴趣。

答案 2 :(得分:-1)

如果你希望它在没有显式调用.Dispose(或最终拥有垃圾收集器.Collect)的情况下进行Dispose,那么你需要将它包装在一个像这样的使用中:

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