在Visual Basic中,实现IDisposable接口(Dispose模式)可以正确释放资源(例如文件、数据库连接、图形对象),这些资源不受垃圾收集器管理。
典型实现如下:
Public Class FileManager Implements IDisposable Private fileStream As FileStream Private disposed As Boolean = False Public Sub New(path As String) fileStream = New FileStream(path, FileMode.Open) End Sub Public Sub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub Protected Overridable Sub Dispose(disposing As Boolean) If Not disposed Then If disposing AndAlso fileStream IsNot Nothing Then fileStream.Dispose() End If disposed = True End If End Sub Protected Overrides Sub Finalize() Dispose(False) MyBase.Finalize() End Sub End Class
重要: 使用 Using ... End Using 结构 — 它确保自动调用Dispose:
Using manager As New FileManager("data.txt") ' 文件操作 End Using
细节:
问题: "为什么在Dispose方法中需要调用GC.SuppressFinalize(Me)?"
正确答案: 它告诉垃圾收集器可以不调用终结器(Finalizer),因为资源已经通过Dispose手动清理。如果不这样,终结器将多次调用,从而降低性能并可能导致重复清理。
故事
在银行软件中,IDisposable实现不正确 — 忘记调用数据库的Dispose,导致连接泄漏。平均来看,应用程序在持续运行2-3天后"挂起"。
故事
在医疗服务中,Dispose的实现不正确(缺少“disposed”标志)。Dispose方法被多次调用,导致重复释放同一资源并产生异常。
故事
在图形编辑器中,忘记调用GC.SuppressFinalize(Me)。终结器在Dispose之后仍然执行,导致资源被双重释放和不稳定(访问冲突)。