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