实例3-12 构造函数的运用
该实例实现步骤如下。
1 创建窗体
在本章的项目chapter3下,右键单击该项目名下面的文件夹“类及对象”,在弹出菜单中选择“添加”→“模块”菜单命令,在弹出的对话框中输入模块名称ConModule,单击“添加”按钮完成模块的创建。
2 添加模块
双击ConModule.vb进入该模块的代码编辑窗口,向其中添加代码3-21中的代码。
代码3-21 ConModule.vb
01. Module ConModule 02. Public Class A 03. Public str As String '定义公共字符串变量str 04. Sub New() '定义不带参数的构造函数 05. str = "不带参数的构造函数" 06. End Sub 07. Sub New(ByVal s As String)'定义带参数构造函数 08. str = s 09. End Sub 10. Public Overridable Function restr() As String '定义可重写函数 11. Return "基类中:" + str 12. End Function
13. End Class 14. Public Class B 15. Inherits A '继承类A 16. Sub New() '显式的声明与基类构造函数相同的构造函数 17. MyBase.New() 18. End Sub 19. Sub New(ByVal s As String) 20. MyBase.New(s) 21. End Sub 22. Public Overrides Function restr() As String '重写函数restr() 23. Return "派生类中:" + str 24. End Function 25. End Class 26. Sub main() 27. Dim a1 As New A '定义A类的实例 28. Console.WriteLine(a1.restr()) 29. Dim a2 As New A("带参数的构造函数") 30. Console.WriteLine(a2.restr()) 31. Dim b1 As New B '定义B类的实例 32. Console.WriteLine(b1.restr()) 33. Dim b2 As New B("带参数的构造函数") 34. Console.WriteLine(b2.restr()) 35. End Sub 36. End Module
代码3-21执行的步骤如下:
① 第2行代码是定义一个类A;第3行代码定义该类的公共字符串变量str;
② 第4行到第6行代码显式定义该类不带参数的构造函数,实现为字符串str赋值;
③ 第7行到第9行代码显式定义A类的带参数构造函数,实现将参数值赋给变量str;
④ 第10行到第12行代码定义可重写函数restr(),实现连接字符串“基类中:”和str值并返回;
⑤ 第13行和第14行代码定义类B并继承类A;
⑥ 第16行到第21行代码显式的声明与基类构造函数相同的构造函数;
⑦ 第22行到第24行代码重写函数restr(),实现连接字符串“派生类中:”和str值并返回;
⑧ 第27行代码、第29行代码、第31行代码、第33行代码分别定义A类和B类的实例;
⑨ 第28行代码、第30行代码、第32行代码、第34行代码分别调用类A和类B中restr()函数,并显示输出其返回的结果。
3 运行结果
按F5键,运行程序,结果如图3-13所示。
图3-13 实例3-12运行结果
2.析构函数
.NET Framework使用“参考跟踪垃圾收集”系统定期释放未使用的资源。Visual Basic 6.0和早期版本使用名为“引用计数”的另一个系统来管理资源。虽然这两个系统自动执行同样的功能,但还是有一些重要差异。
当系统确定不再需要某些对象时,CLR会定期销毁这些对象。当系统资源短缺时,对象释放会快一些,否则释放操作就不那么频繁。在对象失去范围和CLR释放对象这两个时间之间的延迟,意味着不能准确确定对象将在什么时候被销毁。在此类情况下,称对象具有“非确定性生存期”。在大多数情况下,非确定性生存期并不会对程序员如何编写应用程序产生影响,只要记住Finalize析构函数可能不会在对象失去范围时立即执行即可。
这两个垃圾回收系统之间的另一个差异涉及Nothing的使用。为利用Visual Basic 6.0和早期版本中的引用计数,程序员有时将Nothing赋给对象变量以释放这些变量所保存的引用。如果变量保存的是对对象的最后一个引用,对象的资源将立即被释放。在Visual Basic.NET 2005中,尽管可能存在此过程仍然有价值的情况,但执行此赋值操作不会导致被引用对象立即释放其资源。若要立即释放资源,可使用对象的Dispose方法(如果可用)。只有当变量生存期相对于垃圾回收器检测孤立对象所需时间较长时,才应当将变量设置为Nothing。
下面以实例说明资源释放的方法。