gpt4 book ai didi

vb.net - VB.NET 中的模块变量何时实例化?

转载 作者:行者123 更新时间:2023-12-02 05:04:26 24 4
gpt4 key购买 nike

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

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 的构造函数中设置断点并查看调用堆栈,但我在其中看到“外部代码”,但这并没有告诉我很多信息。

最佳答案

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

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

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

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

关于vb.net - VB.NET 中的模块变量何时实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14366432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com