什么时候是模块';是否实例化了VB.NET中的s变量?

什么时候是模块';是否实例化了VB.NET中的s变量?,vb.net,global-variables,Vb.net,Global Variables,我想知道在程序的生命周期中,模块中的变量将在何处初始化,如本例所示: Module Helper Friend m_Settings As New UserSettings() Sub Foo() '... End Sub Sub Bar() '... End Sub End Module Public Class UserSettings Public Property UserName As String

我想知道在程序的生命周期中,模块中的变量将在何处初始化,如本例所示:

Module Helper
    Friend m_Settings As New UserSettings()

    Sub Foo()
        '...
    End Sub

    Sub Bar()
        '...
    End Sub

End Module

Public Class UserSettings
    Public Property UserName As String
    Public Property PrefServer As Integer

    Public Sub New()
        '...
    End Sub

    Public Sub LoadSettings()
        '...
    End Sub
End Class

m_设置
何时初始化?我可以在构造函数中为
UserSettings
设置一个断点,并查看调用堆栈,但我在其中看到了“外部代码”,但这并不能告诉我很多

CLR不直接支持VB.NET模块,它要求所有方法和变量都是类型的一部分。因此,VB.NET编译器实际上会在后台生成一个类。您在模块中编写的所有函数都成为该类的静态方法。您在模块中声明的所有变量都成为该类的静态字段

在模块中初始化的任何变量都会导致生成静态构造函数。初始化代码被移到这个构造函数中

现在应用CLR规则:一旦抖动触及这个类的任何成员,CLR就会运行静态构造函数。然后初始化所有模块变量。这也是您在调用堆栈上看到[external code]的原因,调用起源于CLR内部

很少有这样的问题,CLR中的静态构造函数保证是非常强大的。唯一棘手的问题是变量初始值设定项导致抛出异常。那是勇气开始显现的时候。堆栈跟踪非常神秘,因为它显示了源代码中不存在的代码。引发的实际异常是TypeInitializationException,非常神秘,因为您没有编写任何类型,您需要查看其内部异常以找到真正的原因