成员变量未初始化

问题描述 投票:0回答:1

我开始了一份新工作,我需要用vb.net来写

对于我正在编写的代码,我需要从整数映射到面板。我希望此映射具有整个文件的范围,而不仅仅是单个子例程,因此我尝试这样声明它:

Private ReadOnly MAP = New Dictionary(Of Integer, Panel) From {
    {0, Nothing},
    {1, Foo},
    {2, Bar},
    ...
}

然后,我有一个像这样的子程序(简化)

Private Sub Thing(ID As Integer)
    If MAP.Item(ID) IsNot Nothing
        MAP.Item(ID).Visible = True
    End If
End Sub

假设我调用

Thing(1)
,这应该使
Foo
可见,但什么也没发生。如果我
Dim MAP
inside of
Thing
,它会按预期工作。我显然不想每次调用子程序时都构建我的地图,因为这有点违背了地图的目的,因为增加了每次使用时构建它的开销(尽管它更具可读性)。

基本上我想知道的是为什么当我使用它时

MAP
的结构没有保留?如果以这种方式声明,不是应该在我们开始执行类的任何方法之前构造所有成员变量吗?

vb.net dictionary initialization
1个回答
1
投票

这里的技巧是表单是类,它们具有定义的初始化顺序,其中字段(如

MAP
)在构造函数运行之前初始化。但是,表单控件是在构造函数末尾调用的 InitializeComponent()
 方法中初始化的。

因此,在初始化

MAP

 变量时,
Foo
Bar
 成员变量存在,但它们尚未引用它们要表示的实际控制对象。

要解决此问题,您需要更改代码,以便在

MAP

 方法运行后
InitializeComponent() 集合中添加项目。

© www.soinside.com 2019 - 2024. All rights reserved.