2

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

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_Settings初始化?我可以在构造函数中设置一个断点UserSettings并查看调用堆栈,但我在那里看到“外部代码”,但这并没有告诉我很多。

4

1 回答 1

9

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

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

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

很少有这样的问题,CLR 中的静态构造函数保证非常强大。关于唯一棘手的事故是导致抛出异常的变量初始化程序。那是胆量开始显现的时候。堆栈跟踪非常神秘,因为它显示了源代码中不存在的代码。实际抛出的异常是TypeInitializationException,很迷,因为你没有写任何类型,你需要查看它的InnerException才能找到真正的原因。

于 2013-01-16T21:01:04.307 回答