Cut*_*ert 2 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
Public Property PrefServer As Integer
Public Sub New()
'...
End Sub
Public Sub LoadSettings()
'...
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
什么时候会m_Settings被初始化?我可以在构造函数中设置一个断点UserSettings并查看调用堆栈,但我看到"外部代码",但这并没有告诉我很多.
CLR没有直接支持VB.NET模块,它要求所有方法和变量都是类型的一部分.所以VB.NET编译器实际上生成了一个类.您在模块中编写的所有函数都成为该类的静态方法.您在模块中声明的所有变量都将成为该类的静态字段.
在模块中初始化的任何变量都会导致生成静态构造函数.并将初始化代码移动到此构造函数中.
现在CLR规则适用:一旦抖动接触到该类的任何成员,CLR就会运行静态构造函数.然后初始化所有模块变量.这也是你在调用堆栈上看到[外部代码]的原因,这个调用来自CLR.
很少有这方面的问题,CLR中的静态构造函数保证是非常强大的.关于唯一棘手的事故是变量初始化程序,它会导致抛出异常.这就是胆量开始显现的时候.堆栈跟踪非常神秘,因为它显示了源代码中不存在的代码.抛出的实际异常是一个TypeInitializationException,非常神秘,因为你没有写任何类型,你需要查看它的InnerException来找到真正的原因.
| 归档时间: |
|
| 查看次数: |
2471 次 |
| 最近记录: |