.NET类加载器是否有标准的工作方式?
说我编译这段代码:
Option Strict On : Option Explicit On
Module Module1
Sub Main()
System.Diagnostics.Debug.WriteLine("Main")
Dim g = C.A
End Sub
End Module
Public Class C
Shared Sub New()
System.Diagnostics.Debug.WriteLine("Init C")
End Sub
Shared Property A As New A
End Class
Public Class A
Shared Sub New()
System.Diagnostics.Debug.WriteLine("Init A")
End Sub
Public Sub New()
System.Diagnostics.Debug.WriteLine("A Constructor")
End Sub
End Class
我可以保证编译后的代码(在所有实现的平台中)都有以下输出吗?
Main
Init A
A Constructor
Init C
答案 0 :(得分:5)
是的,调用静态和实例构造函数的顺序是语言规范的一部分。所有符合要求的编译器都应为此程序发出相同的IL。
答案 1 :(得分:4)
因为您正在使用构造函数而不是内联初始化,所以VB编译器不会使用beforefieldinit
标记类型,并且订单是完全受控的。
但是,如果您编写了以下内容(使用内联初始化):
Option Strict On : Option Explicit On
Module Module1
Sub Main()
System.Console.WriteLine("Main")
Dim g = C.A
End Sub
End Module
Public Class C
Shared Function Narg() As A
Dim alpha As New A
System.Console.WriteLine("Init C")
Return alpha
End Function
Shared Property A As A = Narg()
End Class
Public Class A
Shared Sub New()
System.Console.WriteLine("Init A")
End Sub
Public Sub New()
System.Console.WriteLine("A Constructor")
End Sub
End Class
订单未指定。允许使用与原始代码相同的顺序,但可以提前初始化C
。事实上,在我的系统上输出是:
Init A
A Constructor
Init C
Main
原因是C
现在标记为beforefieldinit
。
无偿挑选:不,您的原始代码不能保证具有该输出。在发布版本中,它将没有输出,因为有条件地调用System.Diagnostics.Debug
。