Visual Basic.NET+SQL Server全程指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

实例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。

下面以实例说明资源释放的方法。