我开始了一份新工作,我需要用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
的结构没有保留?如果以这种方式声明,不是应该在我们开始执行类的任何方法之前构造所有成员变量吗?
这里的技巧是表单是类,它们具有定义的初始化顺序,其中字段(如
MAP
)在构造函数运行之前初始化。但是,表单控件是在构造函数末尾调用的 InitializeComponent()
方法中初始化的。因此,在初始化
MAP
变量时,
Foo
和
Bar
成员变量存在,但它们尚未引用它们要表示的实际控制对象。要解决此问题,您需要更改代码,以便在
MAP
方法运行后
InitializeComponent()
集合中添加项目。