如何使用IDisposable接口(不处理内部对象)

时间:2014-05-14 13:47:10

标签: vb.net idisposable

首先,谢谢,如果我的英语不好,请原谅我。    我尝试了很多方法来实现IDisposable接口。根据我从网上获得的图片我实现了界面。在我的测试项目中,我尝试了很多,所以如果我将一些图像加载到内存中我可以看到IDisposible按照我的期望工作。要查看内存(PF使用)我使用任务管理器。这里“test.bmp”是5mb文件

这是我做过的三个实验

    Dim i As Integer = 0
    While (i < 1000)
        i = i + 1
        Dim bmp As New Bitmap("D:\test.bmp")
    End While

它扼杀了我的记忆。然后我试了

    Dim i As Integer = 0
    While (i < 1000)
        i = i + 1
        Using bmp As New Bitmap("D:\test.bmp")
        End Using
    End While

PF稳定到1000.意味着记忆释放了。

然后我试了

    Dim i As Integer = 0
    Dim dt As DateTime = DateTime.Now
    While (i < 1000)
        i = i + 1
        Using oTestDispose As New clsTestDispose
        End Using
    End While
Public Class clsTestDispose
Implements IDisposable

Dim bmp As New Bitmap("D:\test.bmp")

Private disposedValue As Boolean = False        ' To detect redundant calls

' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
    If Not Me.disposedValue Then
        If disposing Then
            ' TODO: free unmanaged resources when explicitly called
            Me.Dispose()
        End If

        ' TODO: free shared unmanaged resources
    End If
    Me.disposedValue = True
End Sub

#Region " IDisposable Support "
' This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
    ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean)        above.
    Dispose(True)
    GC.SuppressFinalize(Me)
End Sub
#End Region

 End Class

此代码告诉“System.StackOverFlowException”。为什么dispose没有清除里面的图像对象?

1 个答案:

答案 0 :(得分:2)

因为您要覆盖Dispose方法并在Me.Dispose内再次调用它,所以此方法以递归方式运行。

您可以使用“MyBase:

”调用Dispose
MyBase.Dispose()

这将调用派生类上的Dispose,阻止它循环并以StackOverflowException结束。