Public Class C(Of T)
Public Shared i As Integer = 0
Public Sub New()
i += 1
End Sub
End Class
'测试代码
Dim o1 As New C(Of Integer)
Debug.Print(C(Of Integer).i)
Debug.Print(C(Of Double).i)
Dim o2 As New C(Of Double)
Debug.Print(C(Of Integer).i)
Debug.Print(C(Of Double).i)
所得的结果是1,0,1,1。可见泛型类的各个构造类的静态成员是独立的,各个构造类型都像是各自定义的类型一样。那么构造类的静态构造函数是什么时候发生的呢?为了研究这个问题,我编写了如下类:
Public Class Class1(Of T)
Shared Sub New()
Debug.Print("Hi, I'm the constructed type of " & GetType(T).Name)
End Sub
End Class
这样我可以在输出窗口察觉静态构造函数执行的实际。我首先试验了下面的代码:
Dim o1 As New Class1(Of Integer)
结果按钮按下的一瞬间,就看到静态构造函数执行了。说明静态构造函数可能是在第一次正式使用构造类型的时候发生的。为了验证这个观点,我还做了这个试验:
Dim o1 As Class1(Of Integer)
'浪费时间的代码,略……
o1 = New Class1(Of Integer)
MsgBox(Class1(Of Integer).w.ElapsedMilliseconds)
结果静态构造函数的确是延后执行的。这说明声明一个构造类型的引用变量并不能导致该构造类型的静态构造函数运行,只有实际使用这个类型才会导致静态构造函数运行。当然,使用构造类型的任何静态成员也会导致他的静态构造函数立即执行,这一点也在我的后续试验中证明了。
那么若是值类型会怎样呢?我将Class简单地改为Structure,并进行了完全同样的试验。结果静态构造函数竟然不能按时发生。泛型值类型的静态构造函数一定要等到实际使用其构造类型静态成员的时候才会发生,这是泛型Structure与Class的一大不同点。
打印 | 张贴于 2004-10-03 21:51:00 | Tag:技术随笔
留言反馈