在Visual Basic中,构造函数是一个Sub New过程,当创建类的实例时被调用并初始化对象。析构函数通过Finalize方法或IDisposable接口(Dispose方法)实现,这对于释放资源尤其重要。
在经典的Visual Basic中,构造函数在创建对象时自动调用(Class_Initialize),析构函数在删除时调用(Class_Terminate)。在VB.NET中增加了重载构造函数、管理和非管理资源释放的区分、使用垃圾收集器(GC)。
错误使用构造函数或析构函数会导致内存泄漏、对象初始化不正确或资源(例如文件)被阻塞。
使用Sub New初始化对象,务必实现Dispose以显式释放资源。如果使用析构函数(Finalize),请记住GC的延迟和无法预测的调用时机。
代码示例:
Public Class ResourceHolder Implements IDisposable Private resource As SomeResource Public Sub New() resource = New SomeResource() Console.WriteLine("资源分配完毕") End Sub Protected Overrides Sub Finalize() Dispose(False) MyBase.Finalize() End Sub Public Sub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub Protected Overridable Sub Dispose(disposing As Boolean) If disposing Then If resource IsNot Nothing Then resource.Release() resource = Nothing End If End If End Sub End Class
关键特性:
可以手动调用已存在对象的Sub New构造函数吗?
不可以,构造函数仅在创建对象时被调用。要重新初始化,请使用单独的方法Reset或类似的方法。
Finalize何时被调用,它的执行是否总是有保障?
Finalize由垃圾收集器在对象销毁时调用,但其执行并不保证(例如,在进程异常终止或断电时)。
为什么需要在Dispose中调用GC.SuppressFinalize?
这可以防止对已经手动释放的对象重复调用Finalize,从而提高性能并防止内存泄漏。
在项目中未实现Dispose,导致几个文件在应用程序结束后仍保持被锁定状态——资源未释放,直到垃圾收集器介入。
优点:
缺点:
实现了IDisposable和Dispose,在处理外部资源时使用了Using。所有文件都正确关闭,应用程序稳定运行。
优点:
缺点: